栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ndk开发(二)JNI、java互调

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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语法知识

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号