在androidstudio工程配置了NDK前提下:
1.创建本地方法调用类
在该类中声明一个静态的native方法
{
public static native int Add(int a,int b);
}
在terminal中利用jni命令获取头文件 javah -d jni -classpath +debug(build目录-intermidates-classes-debug)目录的绝对路径+包名+native方法调用类名;
2.make project 获得上述本地方法调用类的classes文件
3.在main目录下创建jni Folder,将在build-intermicate-classes-debug下生成的头文件移动到jni文件夹中
4.在jni目录中创建.cpp文件,实现具体的c方法
5.通过运行程序或者rebuild项目,在build-intermediates-ndk目录中将找到生成的libs(在build前需要在gradle中声明ndk配置(so库名称和平台类型))
ndk{
moduleName "jniSo"
abiFilters "armeabi-v7a","armeabi"
}
6.so库的使用:放在libs文件夹中需要在项目gradle中声明jniso库的目录位置
:sourceSets {
main {
jniLibs.srcDirs = ['libs'] /**在libs文件夹下找so文件*/
}
}
如果so库放在main下的jniLibs下则不用声明so库目录
so库放在so库生成项目以外的项目中使用,需配置native方法调用类,类的类名和包名需和so库生成项目保持一致。
在改类中需要静态加载so库
static {
System.loadLibrary("MySo");//NDKDEMO可以随便取,但是必须和moduleName "NDKDEMO" 的名字一样
}
android和unity调用so库的c方法格式有所不同 需要作出区别:
android调用android so库的c方法格式:
#include <com_example_test_Load.h>
JNIEXPORT jint JNICALL
Java_com_example_test_Load_Add(JNIEnv *env, jclass type, jint a, jint b) {
// TODO
}
unity调用android so库 c方法的格式:
#include <com_example_test_Load.h>
int Add(int a,int b) {
// TODO
return a+b;
}