JNI(Java Native Interface) 中文名:Java本地接口,Android中与C交互的一种技术。
本文章是基于Android Studio ,所以Eclipse的小伙伴们 sorry啦,原理差不多。
一,配置NDK
创建一个Android项目
(1),创建一个类MyUtils .class
public class MyUtils {
public native String getStringFromC();
}
(2),在Activity调用
public class MainActivity extends AppCompatActivity {
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setText();
}
private void initView() {
text= (TextView) findViewById(R.id.tv);
}
private void setText() {
MyUtils utils=new MyUtils();
text.setText(utils.getStr());
}
static {
System.loadLibrary("sincerly");
}
}
static静态代码会优先于构造函数执行,这里的作用是加载sincerly这个.so库。
写完这个代码 然后makeProject
找到Android Studio Terminal命令窗口,
执行–>>cd app\build\intermediates\classes\debug
执行–>>javah -jni com.aaa.MyUtils
main下边创建jni文件夹
然后把app\build\intermediates\classes\debug下边的com_xx_MyUtils.h剪切至jni文件夹下
找到自动生成的so库
把lib下边的三个全部复制到根目录的lib下边
Android.mk复制到jni目录下
然后再jni目录下创建c文件 我这里的名字叫hello.c
#include "com_tgl_intimate_util_NdkJniUtils.h"
JNIEXPORT jstring JNICALL Java_com_tgl_intimate_util_NdkJniUtils_getStr
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"Sincerly!");
}
配置build.gradle
可以运行啦!
可能会遇到的问题
1,编译抛出异常
useDeprecatedNdk。。这类异常的话可以在gradle.properties添加
android.useDeprecatedNdk=true
2,页面空白
检查Activity的onCreate方法是否正确
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//选第一个
@Override
public void onCreate(Bundle savedInstanceState,
PersistableBundle persistentState) {
super.onCreate(savedInstanceState,persistentState);
}