ndk开发(二)JNI、java互调

目录

1、新建java类,首先静态加载库

2、java调用JNI的方法

3、JNI调用java



上集说到开发环境的搭建,本集踏出第一步,与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语法知识

猜你喜欢

转载自blog.csdn.net/qwildwolf/article/details/120780992