美文网首页Android NDK开发
NDK开发(三)--JNI开发流程

NDK开发(三)--JNI开发流程

作者: 骑着蜗牛闯世界666 | 来源:发表于2019-11-24 23:00 被阅读0次

    一、编写流程

    • 1、声明native方法

    • 2、生成对应的头文件

    使用javah命令

    • 3、在C/C++文件,引入对应的头文件,并实现对应的方法

    使用""而非<>的方式引入。否则会报以下异常.

    error: 'com_canter_ndkdemo3_JNIMethod.h' file not found with <angled> include; use "quotes" instead
    

    如果不知道方法签名,可以使用 javas -p命令打印输出。

    -w484

    C/C++代码的整体实现流程如下:

    找到对应的类-->找到对应的方法-->调用相关的方法-->释放相关的资源-->应用程序进行调用。

    二、静态方法调用

    在 native 层调用 Java 层的静态方法。还有调用Java层的静态变量,并更改它的值。

    JNIEXPORT void JNICALL Java_com_canter_ndkdemo3_JNIMethod_callStaticMethod__I(JNIEnv *env, jclass jclass1, jint jint1) {
    //找到对应的类,需要全路径。将"." 替换成 "/"
    jclass clas_JNIMethod = env->FindClass("com/canter/ndkdemo3/JNIMethod");
    if (clas_JNIMethod==NULL) {
        return;
    }
    //获取对应的方法,静态和实例方法调用的是不同的api
    jmethodID method_StaticMethodId =  env->GetStaticMethodID(clas_JNIMethod, "staticMethod","(Ljava/lang/String;)V");
    if (method_StaticMethodId == NULL) {
        return;
    }
    jstring data = env->NewStringUTF(" call static method");
    if (data == NULL) {
        return;
    }
    //调用相关方法
    env->CallStaticVoidMethod(clas_JNIMethod, method_StaticMethodId, data);
    //调用静态变量
    jfieldID  jfieldID1 = env->GetStaticFieldID(jclass1, "sData", "Ljava/lang/String;");
    if (jfieldID1 == NULL) {
       return;
    }
    jstring  jstring1 = env->NewStringUTF("native-lib");
    //更改值
    env->SetStaticObjectField(jclass1, jfieldID1, jstring1);
    env->CallStaticVoidMethod(clas_JNIMethod, method_StaticMethodId, data);
    //释放相关的资源
    env->DeleteLocalRef(clas_JNIMethod);
    env->DeleteLocalRef(data);
    env->DeleteLocalRef(jstring1);
    
    }
    

    运行结果:


    -w306

    三、实例方法调用

    JNIEXPORT void JNICALL Java_com_canter_ndkdemo3_JNIMethod_callInstanceMethod__I
            (JNIEnv *env, jobject jobject1, jint jint1) {
        jclass clas_JNIMethod = env->FindClass("com/canter/ndkdemo3/JNIMethod");
    if (clas_JNIMethod == NULL) {
        return;
    }
    //找到对应的构造方法
        jmethodID  construct_Method = env->GetMethodID(clas_JNIMethod, "<init>", "()V");
    if (construct_Method == NULL) {
        return;
    }
    //创建对象
    jobject jniMethodObj = env->NewObject(clas_JNIMethod, construct_Method, NULL);
    if (jniMethodObj == NULL) {
        return;
    }
    
    //找到对应的实例
    jfieldID  jfieldID1 = env->GetFieldID(clas_JNIMethod, "address", "Ljava/lang/String;");
        if (jfieldID1 == NULL) {
            return;
        }
    jstring addressData = env->NewStringUTF("native call guangxi");
    //修改对应的实例
    env->SetObjectField(jniMethodObj, jfieldID1, addressData);
        
    //找到对应的实例方法方法
    jmethodID jmethodID1 = env->GetMethodID(clas_JNIMethod, "logAddress", "(Ljava/lang/String;)V");
    if (jmethodID1 == NULL) {
        return;
    }
    jstring address = env->NewStringUTF("call instance method");
    //调用对应的实例方法
    env->CallVoidMethod(jniMethodObj, jmethodID1, address);
    env->DeleteLocalRef(address);
    env->DeleteLocalRef(addressData);
    
    }
    

    相关文章

      网友评论

        本文标题:NDK开发(三)--JNI开发流程

        本文链接:https://www.haomeiwen.com/subject/rwbrwctx.html