笔者因为项目需要,所以研究了一下NDK编程,主要是讲一些方法放到.so库中用来加载,增加代码的保密性,以下是整理的NDK入门笔记。
首先我们需要创建一个普通的项目
然后安装NDK
安装完成之后
接下来我们可以进行代码的编写了
首先在app下的java目录下建立java文件
然后添加native方法
建立JNI目录
然后在命令行下进入到java目录 输入: javah -d ../jni com.xxx.xxx.ndkdemo.JniUtils
现在 可以看到jni目录下生成了c 的头文件
然后在jni目录中建立.c或者.cpp文件用来编写C或者c++代码:
在新建的.c文件中添加如下代码:
在app的build.gradle中的defaultConfig标签下添加
ndk{
moduleName "helloworld"//生成的so名字
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。
}
进行编译之后
可以看到build/intermediates/ndk/debug/lib下已经生成了3种架构下的.so库:
接下来开始调用.so库中的方法,在MainActivity中添加如下代码:
现在终于可以直接运行在手机上了 少年心好累...
接下来我们准备实现.so的常规调用了,毕竟一个项目中.so文件一般是放在libs目录下的嘛
先把jni目录删除,然后将三个架构的.so库剪切到libs中,并且将编译生成的ndk目录删除,用于确定真实调用,然后在build.gradle
中的android标签下配置jni引用路径:
再次运行至手机...
OK ,关于NDK编程以及引用.so库入门就告一段落了,希望能对你产生帮助。
笔者注:.so文件可以看作是一个加密的jar包,所以要调用它必须要有相同包名,也就是要与.h和.c中声明的方法的路径一致才能调用,所以常规的方法是将调用代码打包成jar文件,然后外部调用打包后的jar中的方法来间接调用.so中的方法。在此就不给出实例了,欢迎读者联系笔者反馈问题以及技术讨论。