一、配置so需要的库环境
高版本的Android Studio已经集成了LLDB调试库,所以说,大家不要在找为什么没有,该从哪里去找。现在很多教程都是老的,这个算是我用的这个版本的最新方法,踩坑版。
File->setting
二、创建so文件的工程
直接选择最后一个
File->New project
配置自己按喜好配
配置完成后在Project模式下查看是这样的。
函数名: Java_com_example_myjniapp_MainActivity_stringFromJNI
函数名代表了一个映射关系
这个native方法的命名方式往往是包名_类名_方法名(并非绝对)。
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
想要哪个函数与C++通信,那么哪个函数前面就需要有"native"字样表示。在MainActivity最后的stringFromJNI函数是需要生成so文件被调用的。
三、 编译so文件
build ->make project
编译生成so文件,build->intermediates->cmake->debug/release/obj目录下面
四、so文件存放
编译完成后,接下来是该如何使用编译好的so文件。
1)使用jniLibs文件夹
- 在app->src->main中创建一个叫做:jniLibs文件夹。
- 把 cmake编译的so文件放入这里,就算配置完成了。
- 不用和网上大多数教程一样去修改app文件夹下的"build.gradle"
2)使用libs文件夹(不建议)
用这个文件夹的好处就是不需要再去创建新的文件夹了,
把 cmake编译的so文件放入app文件夹下的libs文件夹
但是还需要额外的配置app文件夹下的"build.gradle"。
在build.gradle文件里面添加上这一段代码,指定libs代替jniLibs的作用即可,不需要添加其他代码!!!
此时,so文件所需的内容就已经配置完成了。
sourceSets {
main{
main.jni.srcDirs = []
main.jniLibs.srcDirs = ['libs']
}
}
更改build.gradle文件后需要Sync(同步)
五、使用so文件
在中间键文件:native-lib.cpp中,有一个默认的函数,函数名是:Java_com_example_myjniapp_MainActivity_stringFromJNI
当我们在调用so的位置也需要按照so中函数名的方式创建一个一模一样的路径,并且类名叫做:MainActivity,有一个叫做stringFromJNI的函数,只有这样才会调用成功。
调用方式其实上面的类里有。
要对接给外部团队或第三方使用的话可以构建一个中间模块,用这个包名和类名,使用一个JNIInterface类来加载so,提供so调用的方法
public class JNIInterface {
static {
System.loadLibrary("native-lib");
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
外部实现创建这个类的实例,就可以调用了
public JNIInterface jniInterface = new JNIInterface();
//使用
jniInterface.stringFromJNI();