一,流程
1. 新建java文件,声明本地方法,loadlibrary
2. 用javah.exe,生成.h文件
3. 新建Android.mk
4. 新建Application.mk
5. 新建.cpp文件,拷贝.h文件中的方法,并实现
6. 用ndk-build.exe,build生成so库
7. 拷贝so库到你的项目中,即可开始使用
二,环境搭建
1. 在Android Studio中配置NDK
进入File->Project Structure,打开Project Structure窗口 未配置ndk路径时,左下方会有个download按钮,可以点击下载
2. Android Studio中配置插件javah.exe ndk-build.cmd
进入File->Settings->Tools->External Tools,点击 + 号增加javah -jni命令,是根据java文件生成.h头文件的,会自动根据java文件中的类名(包含包名)与方法名生成对应的C/C++里面的方法名。下面是参数配置及其含义:
1). Program: JDKPath\bin\javah.exe
这里配置的是JDK目录下的javah.exe的路径(根据实际情况填写)。
2). Parametes: -classpath . -jni -d ModuleFileDir/src/main/jni FileClass
这里FileClass指的是要执行操作的类名(即我们操作的java文件),
ModuleFileDir/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
3). Working directory: ModuleFileDir\src\main\java module目录下的src\main\java目录(不是很理解)。
使用方式:选中java文件—>右键—>External Tools—>javah-jni,将生成jni文件夹以及文件夹下的 包名.类名的.h头文件 (名字过长,我们可以自己重命名)。
ndk -build命令,是根据C/C++文件生成so文件的。下面是参数配置及其含义:
1). Program: F:\apk\sdk\ndk-bundle\ndk-build.cmd
这里配置的是ndk下的ndk-build.cmd的路径(根据实际情况填写)。
2). Working directory: ModuleFileDir\src\main
设置工作目录为当前module下的src/main目录下。
使用方式:选中C/C++文件—>右键—>ExternalTools—>ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。
三,简单实例
1. 创建访问本地C/C++方法的java类文件
图中标记的包名,类名,方法名,以及so库名称需与.h以及.cpp文件中一致。
2. 右键点击刚刚创建的java文件,选择External Tools->javah-jni,自动生成.h文件以及jni目录。
3. 在.h同级目录下,新建Android.mk文件
4. 在.h同级目录下,新建Application.mk文件
5. 在.h同级目录下,新建.cpp文件
图中方法的第二个参数类型,必须与.h文件中的类型一致,否则生成的so库,会找不到本地方法。该参数的类型也可以是jobject,这里统一改成jclass。
6. 右键点击.cpp文件,选择External Tools->ndk-build
build完成后,会自动生成libs和obj两个目录,libs目录下存放着各个版本的so库7. 将libs下的so库拷贝到项目libs目录下,删除新生成的jni,libs,obj目录,在module级build.gradle文件中,添加配置jni路径
8. 新建Activity 在activity中调用本地方法
四,运行结果
五,出错情况
1. java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.ancloud.test.JniTest.getStringFromC()
找不到本地方法。可能原因:
cpp文件中,没有include .h头文件;
cpp文件中的方法名参数,与.h头文件中的方法名,参数不一致;
2. 尝试了直接return “hello world”;
找不到本地方法 结果ndk-build时,会报错
暂时不理解为什么一定要用return env->NewStringUTF("Hello jni with me!");这种写法,后续再更新。。。
网友评论