jni 编译三种方法
- 纯源码编译
- 写头文件,提供.a文件 编译
- jni中调用so文件 编译
1. 创建工程
- 创建一个 JniDemo 项目
- JniDemo 项目为Navite C++项目
-
项目目录结构中有cpp文件,CMakeLists.txt
创建navite.png
2. 配置项目
- 在local.properties中配置NDK目录
- 在studio->File->Project Structure->Modules->配置Ndk
- 若项目中没有NDK需要去下载
3. 文件结构
- .cpp 是连接Java代码源文件,对其进行编写
4.分析
1.pngextern "C" JNIEXPORT jstring JNICALL
Java_com_zyj_jnidemo_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
4.1. 函数分析
- Java :语言
- com_zyj_jnidemo :对于项目包名
- MainActivity :类名(注册so文件,引用方法)
- stringFromJNI :方法名
- 命名规范就是 Java_包名类名方法名
4.1.1 在MainActivity 中使用 :(包名是com.zyj.jnidemo)
static {
System.loadLibrary("native-lib");
}
public native String stringFromJNI();
通过stringFromJNI 获取
4.2. extern "C" 避免编译器按照C++方法编译C函数
4.3. JNIEXPORT 函数可以被其他函数调用
4.4. jstring 返回类型
4.5.设置CMakeLists.txt 生成的so文件路径:
结果展示.png # set(原路径, 目标路径, 生成哪些平台对于的库文件)
# 参数分析
# CMAKE_CURRENT_SOURCE_DIR: 这个是cmake的库的原路径
# /../jniLibs: 这个是指与CMakeList.txt 所在目录的同一级目录
# ANDROID_ABI:生成哪些平台对应的库文件
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
4.6. 生成指定arm文件
defaultConfig {
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
abiFilters "armeabi-v7a" // 指定只生成armeabi-v7a
}
}
}
网友评论