一、概述
Java层向C层通信
通过调用静态无参数、有参数的native方法
通过调用非静态无参数、有参数的native方法
C层向Java层通信
C层访问和修改Java层的属性
C层访问和修改Java层的静态属性
C层访问Java层的方法
C层访问Java层的静态方法
C层访问Java层的构造方法,并创建Java对象返回
java中传入数组
C中生成一个数组返回给java
二、实现
Java层向C层通信
通过调用静态无参数、有参数的native方法
JniTest.java
// native的静态方法,生成的JNI函数参数是(JNIEnv *env, jclass jcls)
public native static String getStringFromC();
// 生成的JNI函数参数是(JNIEnv *env, jclass jcls, jstring jstr_input)
public native static String getNewString(String input);
在java中声明两个native方法,然后通过javah命令生成头文件,具体的头文件生成步骤,可以看JNI系列之入门Hello JNI C(一):
com_jerry_jnitest_JniTest.h
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringFromC
(JNIEnv *, jclass);
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getNewString
(JNIEnv *, jclass, jstring);
具体实现:
// 静态无参函数实现,返回一个C的字符串
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringFromC
(JNIEnv *env, jclass jcls) {
char *text = "Hi, Jerry! 动态链接库,调用起来了!";
return (*env)->NewStringUTF(env, text);
}
// 静态有参函数实现,新建一个C字符串与java输入的字符串拼接后返回给java
JNIE