### NDK相关知识点详解 #### 一、理解NDK与JNI机制 **标题与描述解析:** “ndk相关笔记”这一标题明确指向了Android Native Development Kit(NDK)的相关内容,而描述“自己学ndk开发时的一些总结,希望对你有帮助”则暗示了这些笔记是基于个人学习和实践经验的总结,旨在分享对NDK的理解和开发技巧。 **知识点详解:** - **NDK简介:** NDK是Android平台下用于开发原生应用的一套工具集,它允许开发者使用C或C++语言编写代码,并通过JNI(Java Native Interface)与Java层进行交互。这为性能敏感的应用提供了底层优化的可能性。 - **JNI作用:** JNI是一种标准接口,允许Java代码调用本地C/C++函数,反之亦然。在Android开发中,通常是在Java代码中声明native方法,然后在C/C++中实现这些方法。例如,文中给出的例子`public native String stringFromJNI();`就是声明了一个由C/C++实现的本地方法。 - **NDK与性能:** 使用NDK可以针对特定场景(如图形处理、音频编解码等)进行更深层次的优化,因为C/C++相比Java在控制硬件资源上更为直接和高效。 #### 二、NDK项目配置与构建流程 **部分代码解析:** - **Application.mk与Android.mk的作用:** 这两个文件是NDK项目构建过程中的关键配置文件。`Application.mk`用于设置整个项目的全局属性,如CPU架构类型、ABI版本等;而`Android.mk`则是具体模块的构建规则文件,定义了源文件、目标库或可执行文件等。 - **构建命令:** `$NDK/ndk-build`是执行构建的命令,它会根据`Application.mk`和`Android.mk`中的规则编译C/C++代码,生成动态链接库(.so文件),并将其放置到预设的目录中,供Java层调用。 #### 三、NDK与JNI的实践 **示例代码分析:** ```c jstring Java_net_test_jni_Main_stringFromJNI(JNIEnv *env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello"); } ``` - **函数签名:** `Java_net_test_jni_Main_stringFromJNI`是C/C++中实现的一个JNI函数,其命名遵循特定的规则,即`Java_<包名>_<类名>_<方法名>`。 - **参数解析:** `JNIEnv *env`是JNI环境指针,用于调用JNI函数;`jobject thiz`是指向Java对象的引用,在静态方法中可能不使用。 - **功能实现:** 该函数返回一个UTF编码的字符串"Hello",通过`NewStringUTF`函数创建并返回给Java层。 #### 四、NDK项目结构与构建规则 - **LOCAL_PATH的设定:** 定义了当前源文件所在的目录,用于相对路径的引用。 - **LOCAL_MODULE与LOCAL_SRC_FILES:** 分别指定模块名称和源文件列表,用于确定编译哪些源代码。 - **BUILD_SHARED_LIBRARY:** 指明构建的是共享库,生成.so文件。 #### 五、深入理解NDK开发 - **跨语言编程:** NDK通过JNI机制实现了Java与C/C++之间的跨语言通信,这对于整合高性能的原生代码与灵活的Java逻辑是至关重要的。 - **构建与调试:** 掌握正确的构建流程和调试技巧是NDK开发不可或缺的一部分,了解`ndk-build`的工作原理以及如何设置断点、查看日志对于解决问题非常有帮助。 以上是对“ndk相关笔记”的深入解析,涵盖了从理论到实践的多个方面,希望能为从事或即将从事Android原生开发的读者提供有价值的参考。
实例:
1.java代码中实现本地方法的声明以及加载C库
public native String stringFromJNI();
public native String unimplementedStringFromJNI();
static{
System.loadLibrary("jnitest");
}
/*static 中的代码先于onCreate()方法*/
2.在工程目录下建立Application.mk文件,文件内容
APP_PROJECT_PATH:=$(call my-dir)
APP_MODULES :=jni
3.在android工程项目中新建jni文件夹,实现C代码,需两个文件
1>
mkAndroid.mk是一个makefile,用来告诉NDK需要编译哪些文件,生成哪些模块。
LOCAL_PATH := $(call my-dir)
LOCAL_PATH(用于在开发树中查找源文件。宏函数"my-dir",由编译系统提供,用于返回当前路径(即包含Android.mk file 文件目录))
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),
除LOCAL_PATH 。因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE := jnitest
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助