Android NDK(JNI)详解教程四 引用、释放资源

2023-03-01  本文已影响0人  Kael_Zhang的安卓笔记

JNI 引用

JNI 定义了八种 Java 基本类型,其余的 jobject、jclass、jarray、jxxxArray、jstring 等都是引用类型。JNI 的引用两个含义:Java 中的引用类型、C/C++ 中的指针,会带来的一个问题:如果引用被 JVM 释放了,C指针仍然指向一个地址,但对应的地址中数据已经被释放了!

创建 释放
FindClass DeleteLocalRef
NewString DeleteLocalRef
NewStringUTF DeleteLocalRef
NewObject DeleteLocalRef
NewXxxArray DeleteLocalRef
GetObjectField DeleteLocalRef
GetObjectClass DeleteLocalRef
GetObjectArrayElement DeleteLocalRef

字段和方法 ID( jfieldID 、 jmethodID)

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_sample_projectname_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    // get the class 
    jclass class_obj = (*env)->GetObjectClass(env, jobject );

    // get the field id, com_sample_projectname_MainActivity 类中有 age、name成员变量
    jfieldID id_age = (*env)->GetFieldID(env, class_obj , "age", "I");
    jfieldID id_name = (*env)->GetFieldID(env, class_obj , "name", "Ljava/lang/String;");

    // get the field value
    jint age = (*env)->GetIntField(env, jobject , id_age);
    jstring name = (*env)->GetIntField(env, jobject , id_name );

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
上一篇 下一篇

猜你喜欢

热点阅读