本文主要记录JNI里C和Java的相互调用
JNI的API:https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
测试源码 github: https://github.com/CL-window/JNI-c-call-java-
测试环境 :ubuntu, android studio,ndk10e
主要分为以下几个方面实现代码:
1. java 调用 c
2. c 调用 java的无参数的static方法
3.c 调用 java的无参数的非static方法
4.c 调用 java的有参数的非static方法
5.c 获取以及更改 java里非static变量的值
下面一条一条实现,android studio 配置NDK 环境还不会的请参考:android之NDK环境小试牛刀
主要就是下载好NDK,然后安装好,项目的 gradle.properties 文件里新增 android.useDeprecatedNdk=true 就OK了。
1.先把 native 方法写出来
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("slack",getDataFromCCode());
//JniData.getTime();
putDataToJavaCode();
putDataToJavaCodeWithParams("slack");
putDataToJavaCodeWithParamsAndReturn("slacking");
}
static{
System.loadLibrary("jnidemo");
}
// java 调用 c
public native String getDataFromCCode();
// c 调用 java 这里是先java调用c(可以直接c函数里调用javaset ,但是需要c代码先跑起来),再c调用java
public native void putDataToJavaCode();
// c 调用 java 有参数,无返回值
public native void putDataToJavaCodeWithParams(String data);
//c 调用 java 有参数,无返回值 get set 方法改变java里的值
public native void putDataToJavaCodeWithParamsAndReturn(String data);
}
2. 生成 *.h 文件
root@chenling-VirtualBox:/home/chenling/java/androidstudio/JNIDemo/app/src/main# cd java/
root@chenling-VirtualBox:/home/chenling/java/an