NDK的基础知识,强烈推荐小楠总的NDK系列博客,先拜读一遍,照着学习还是很厉害的
xxx.c ——> windows .obj ; Linux .o –》 语法检查
2. 链接:将函数之间的关系链接起来,生成一个静态或动态库文件(可执行文件)
.o —–> log.so .dll .exe
静态库:静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分,已经整合进去了
动态库:装入过程中将所有动态链接库载入内存。应用程序在运行时,将所有可能要运行到的模块都全部装入内存(共享内存),
动态链接过程只是把需要调用的函数的路径做个标志(类似于头文件声明),直到运行用到函数时才会从内存载入
当我们调用 java中native声明的javaDiff()方法 的时候会到 Java虚拟机 的内存当中来处理找这个方法,
而加了 native 关键字的时候他就会去到 C++/c 的堆栈空间找这个 C++/c 的实现。
想要只测试so库,需要将验证的so库放到jniLibs指定的目录,然后将build.gradle中相应的所有的cmake都注释掉如下
externalNativeBuild {
cmake {
}
在c、c++中叫函数 java中叫方法,实际上两个是一样的玩意,这里为了区分jni和native所以有两个叫法
1、静态注册
2、动态注册
//这个是具体的类名,不能写错,写错就无法注册成功,也就无法调用jni函数了 clazz = (*engv) -> FindClass(engv, "com/jni/www/jnidemo/dif/JNIDynamicUtil");
如:
动态注册:由于动态注册也是要通过java类中的绝对路径来找到类中的class,才能进行映射;如代码中
3.so库链接
若是要引用第三方so库的话需要将第三方的头文件和当前的so库建立关系
快速获取头文件的方式:
http://blog.csdn.net/wang_zhi_hao/article/details/
归根结底都是通过命令 javah -d jni -jni -classpath class的路径生成
如:
javah -d jni -jni -classpath
C:UsersAdministratorDesktopJNIDemoappbuildintermediatesclassesdebug com.jni.www.jnidemo.JNIUtil
会在当前目录下创建jni目录(没有的话),并将自动生成.h头文件在jni目录下,
注意此时的头文件是整个是:包名_类名.h 一定要改成和.c文件一样的文件名;此外还要.h头文件的函数声明也要和.c对应上,尤其是动态注册的函数一定一定要一一对应上,否则很容易报找不到方法
如果想要jni中调用第三方的so库,那么需要通过书写cmakeLists.txt脚本关联jni与第三方的so库,编写好之后build就可以是掉第三方so库的方法了;
如:在cmakeList.txt中加入,其中jni是存放头文件的目录
set(distribution_DIR ${CMAKE_SOURCE_DIR}/jni)
#加入头文件:第三方的so库的头文件加入编译到native-lib.so中,native-lib.so中才能使用它里边的函数
#参数是头文件所在的目录
target_include_directories(native-lib PRIVATE ${distribution_DIR})
具体用法可以参考:
文档地址:
https://developer.android.com/ndk/guides/cmake.html
build.gradle脚本中配置externalNativeBuild{}中的信息可以查看:
app.externalNativeBuildcmakedebugarm64-v8acmake_build_command.txt,这里有build之后的具体信息
比如:
查询文档可以知道 arguments 中 -DANDROID_PLATFORM 代表编译的 android 平台,
文档建议直接设置 minSdkVersion 就行了,所以这个参数可忽略。
另一个参数 -DANDROID_TOOLCHAIN=clang,
CMake 一共有2种编译工具链 - clang 和 gcc,gcc 已经废弃,clang 是默认的。
流程:
demo
http://mp.weixin..com/s/QTxEQg4s5ummtFNe8vRIvA
CMake 的官方文档使用。
https://cmake.org/documentation/
同时在这推荐一个中文翻译的简易的 CMake手册
https://www.zybuluo.com/khan-lau/note/
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/5668.html