JNI开发,可以实现Java与c/c++互相调用。
1.NDK开发中的静态库、动态库就是Linux中的概念
静态库:所有函数库编进目标代码,如果静态函数库改变类,则整个应用程序需要重新编译,名称对应libxxx.a
动态库:动态库不会编入目标代码,所以动态库改变不影响应用程序,名称对应libxxx.so
2.JNI注册方式有2种:静态注册、动态注册
静态注册:流程繁琐,c源文件中函数名要与java native接口一一对应(下文都是此注册方式);
动态注册:在c源文件中使用JNINativeMethod数组来声明java native与c中函数对应关系,还需要写一个JNI_OnLoad函数(android aosp源码中大量使用此注册方式)
1. Java call C
- 在java文件中声明native接口;
- 生成头文件(javac -h 命令);
使用此命令生成头文件 javac -h . JNI.java
- 拷贝.h文件到jni代码目录,并实现.c源文件;
- 配置CMakeLists.txt编译生成动态库(.so)/静态库(.a)。
demo工程如下:
- JavaCallCJNI.java内定义native接口;
- src/main/jni目录下进行c代码实现
CMakeList.txt内容如下:
cmake_minimum_required(VERSION 3.4.1)
add_library(
# 生成的lib名称
java_call_c
# 动态库
SHARED
# 源文件
src/main/jni/java_call_c.c)
find_library(
log-lib
log )
target_link_libraries(
java_call_c
${
log-lib})
build.gradle文件中,在android节点下配置cmake内容。
externalNativeBuild{
cmake{
path "CMakeLists.txt"
}