JNI方法數(shù)組和引用

JNI方法

步驟:
1.獲取jclass
2.獲取方法ID;jmethodID
3.jni調(diào)用java的方法

extern "C"
JNIEXPORT jstring JNICALL
Java_com_ybj_jnin_MainActivity_getMethod(JNIEnv *env, jobject instance) {

    // TODO
    //jobject obj
    jclass _jclas = env->GetObjectClass(instance);
    //(jclass clazz, const char* name, const char* sig)
    jmethodID _jmethodID = env->GetMethodID(_jclas,"getName","()Ljava/lang/String;");
    //jni 調(diào)用java的方法
    //(jobject obj, jmethodID methodID, ...)
    jstring str = (jstring) env->CallObjectMethod(instance, _jmethodID);
    char * string = (char *) env->GetStringUTFChars(str, NULL);
    char text[20] = "success";
    //(char* _Nonnull __restrict, const char* _Nonnull __restrict)
    char * finalResult = strcat(string,text);

    return env->NewStringUTF(finalResult);
}

數(shù)組

步驟:
1.獲取數(shù)組元素
2.獲取數(shù)組長度
3.釋放元素

//首先將a強(qiáng)制聲明為指向整數(shù)的指針,讀取指針對應(yīng)的整數(shù)
int compare(const void* a, const void* b){
    return (*(int*)a - *(int*)b);
}

extern "C"
JNIEXPORT void JNICALL
Java_com_ybj_jnin_MainActivity_getArray(JNIEnv *env, jobject instance, jintArray arrays_) {
    jint *arrays = env->GetIntArrayElements(arrays_, NULL);
    //獲取數(shù)組長度
    //(jarray array)
    int _len = env->GetArrayLength(arrays_);
    //(void*, size_t, size_t, int (*)(const void*, const void*))第三個參數(shù)需要強(qiáng)轉(zhuǎn)
    qsort(arrays,_len, sizeof(int),compare);
    // TODO

    env->ReleaseIntArrayElements(arrays_, arrays, 0);
}

引用(解決JVM回收J(rèn)NI對象)

  • 局部引用
    通過NewLocalRef和各種JNI接口創(chuàng)建(FindClass、NewObject、GetObjectClass和NewCharArray等)。
    會阻止GC回收所引用的對象。函數(shù)返回后局部引用所引用的對想會被JVM自動自動釋放,或調(diào)用DeleteLocalRef釋放。

-全局引用
調(diào)用NewGlobalRef基于局部引用創(chuàng)建。會阻止GC回收所引用的對象??梢钥绶椒?,跨線程使用。JVM不會自動釋放。必須手動調(diào)用DeleteGlobalRef手動釋放

-弱全局引用
與全局引用不一樣的是,弱全局引用:
節(jié)省內(nèi)存,在內(nèi)存不足時可以是釋放所引用的對象。
可以引用一個不常用的對象,如果為NULL的時候(被回收了),可以手動再臨時創(chuàng)建一個。

extern "C"
JNIEXPORT void JNICALL
Java_com_ybj_jnin_MainActivity_getLocalReference(JNIEnv *env, jobject instance) {
    //模擬一個循環(huán)
    for (int i = 0; i < 100; ++i) {
        //(const char* name)
        jclass  _jclass = env->FindClass("java/util/Date");
        jobject _jobj = env->NewObject(_jclass,env->GetMethodID(_jclass,"<init>","()v"));
        //對象的操作
        env->DeleteLocalRef(_jobj);
    }
    // TODO

}

JNI調(diào)用構(gòu)造函數(shù)

傳入“<init>”作為方法名,“V”作為返回類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容