目录
上集说到开发环境的搭建,本集踏出第一步,与java互调
1、新建java类,首先静态加载库
static {
System.loadLibrary("******");//******要与CMakeList中的add_library设置的名字一致
}
2、java调用JNI的方法
固定搭配,需要在方法名前加上native,代表这是调用native的方法
public native String callNativeMethod(String text);
先写这个,会报错,alt+enter,提示Create JNI function for callNativeMethod,回车,再去native-lib文件看代码,自动生成了方法
Java_com_nobo_androidfortest_jni_JniTools_callNativeMethod(JNIEnv *env, jobject thiz,jstring text)
,红色部分是包名,后面是JNI方法,env是中间环境(自己理解的),thiz是java类,text是传进来的参数
3、JNI调用java
extern "C"
JNIEXPORT jstring JNICALL
Java_com_nobo_androidfortest_jni_JniTools_callNativeMethod(JNIEnv *env, jobject thiz,
jstring text) {
jmethodID methodId = env->GetMethodID(clazz,"callJavaMethod",
"(Ljava/lang/String;)Ljava/lang/String;");
env->CallObjectMethod(thiz,methodId,text);
return env->NewStringUTF("成功调用java方法");
}
这里类似反射代码,通过thiz,获取到类,然后通过类,获取到方法名,然后就可以调用java该方法了 第三个参数部分可以看看android反编译知识,smali语言,之前搞反编译见过这个,要不然还真理解不了,括号里的String是参数,括号外的String是返回类型, 如果是(Ljava/lang/String;)V;代表参数是String类型,返回值Void,相对应的,调用应该写为 env->CallVoidMethod(thiz,methodId,text); 如果是(Ljava/lang/String;)Z;代表参数是String类型,返回值Boolean,相对应的,调用应该写为 env->CallBooleanMethod(thiz,methodId,text); 如果是(Ljava/lang/String;)I;代表参数是String类型,返回值Boolean,相对应的,调用应该写为 env->CallIntMethod(thiz,methodId,text); ... 这部分估计需要补些smali语法知识