android studio中jni的so库编写流程
目录
1、准备工作
- 打开sdkManager,安装NDK和相关组件
- 新建android项目
- 配置javah-tool
相关路径:
//固定编译指令 -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
//固定工作空间 $ModuleFileDir$\src\main\Java
- 配置ndk_build-tool
- 配置project目录下的local.properties文件
代码块:
android.useDeprecatedNdk=true
- 配置app模块下build.gradle文件
代码块:
ndk{ moduleName "URLPATH" //生成的so文件名字,调用C程序的代码中会用到该名字 abiFilters 'armeabi-v7a' ,'x86', 'x86_64', 'arm64-v8a'//so库兼容的相关cpu类型 }
sourceSets.main { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] //disable automatic ndk-build call }
2、开始开发
- 在app-src-main目录下建立jni目录
然后在弹出界面直接点finish,不用选中change jni location的选项
- 在jni目录下建立Android.mk文件
LOCAL_PATH :=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :=URLPATH LOCAL_SRC_FILES :=URLPATH.c include $(BUILD_SHARED_LIBRARY) ##URLPATH分别对应so库的库名和下面步骤中对应的.c文件
- 在jni目录下建立Application.mk文件
APP_MODULES := URLPATH APP_ABI := armeabi-v7a,x86,x86_64,arm64-v8a ## 上面两个=后面的参数对应app-build.gradle文件中的ndk配置
- 在app-src-main-java路径下建立so原型的java类
//类名最好和你需要的SO库名一致 public class URLPATH { //声明库名 static { System.loadLibrary("URLPATH"); } //建立静态的native函数,也可以非静态native函数,可以不要参数 public static native String getPath(String action); }
- 选中原型java类,通过自己建立的javah工具进行编译我们建立的原型类,编译成功后会在jni目录中生成相应的.h文件
编译结果
- 在jni目录下编写对应的.c或者.cpp文件
// // Created by Administrator on 2019/2/20. // //引用上一步生成的.h头文件 #include "com_linzi_ndkapplication_JNITest_URLPATH.h" /** * 上边的引用一定要和.h的文件名加后缀, * 下面的方法名一定要和.h文件中的方法名称一样 */ const char *str="我是so库内容:"; //定义c语言的相关执行方法,方法名要和引用的头文件中的方法名一致,函数的参数前两个参数固定,如果你的java原型类中的函数带有参数,则这该函数的第三个及以后的参数就要转为相对应的jni类型的参数(String--jstring,int--jint等等) JNIEXPORT jstring JNICALL Java_com_linzi_ndkapplication_JNITest_URLPATH_getPath (JNIEnv *env, jobject obj,jstring action) { return (*env)->NewStringUTF(env, str); }
- 选中jni目录使用我们自己建立的ndk-build工具进行编译生成so文件,这个生成的so库会自动放在项目的lib目录下
编译结果 - 在java中调用
自此便是一个完整so库开发的过程,C语言好的小伙伴可以实现更多丰富的功能。