Android版本:3.4 NDK版本:17.1.48…
因为之前项目的原因,接触到了JNI调用c代码这种提高性能的编程方式,所以一直想研究研究,正好这几天有空,所以就动手实践了一下。
1、配置ndk环境变量
打开project structure查看NDK路径,如下图
经ndk location加到环境变量里就行了,在环境变量里新建一个NDK_HOME,把上图ndk路径放进去,再把%NDK_HOME%加到path里去;
最后,在命令行输入ndk-build回车,出现下图就算配置成功了
2、JNI文件编写
1> 首先在studio中新建一个android工程,新建一个类,我是新建了一个math类,代码如下图所示
package com.model.testndk;
public class Math {
static {
System.loadLibrary("Math");
}
public native static String getStringFromNative();
}
编译工程找到Math.class文件,我的是在app\build下的目录,如下图所示:
2>编译产生.h头文件
在studio的终端中,cd到app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes目录下,使用javah命令编译产生头文件,如下图所示;
vaWithJavac\classes>javah -jni com.model.testndk.Math
编译成功后会在classes目录下产生头文件,如下图所示
在main文件夹下新建jni文件夹,将头文件移到jni文件夹下,然后复制一份头文件修改后缀名.c,就得到了c文件,但是需要在该c文件中include头文件,如下图所示
3> 编写mk文件
在jni文件夹下新建Android.mk文件和Application.mk文件,内容如下图所示
还需要在builde.gradle中配置ndk
详细的参数说明我就不多说了,但是要保证LOCAL_MODULE的值和build.gradle中的muduleName一致就可以了。
3、编译so动态库;
在studio的终端中cd到jni目录下,输入ndk-build编译出现下图就说明编译成功了
4、使用so文件
编译成功只有可以发现main目录下多出两个文件夹,libs和obj
jniLibs是我新建的,使用so文件需要这个目录,将libs中的so拷到jniLibs中即可。
5、出现的问题;
1> …arm64找不到so;
可能是你运行的机器cpu架构不包括在这几中生成的so动态库中;
2> no implementation for native method…;
1、我的LOCAL_MODULE和build.gradle中的ndk下的moduleName不相同;
2、c代码中的方法是空的,没有实现。。
以上就是一个简单地demo,下一步试试cmake编译so库
参考 1、Android编译so库
2、Android NDK 简介及环境配置(一)