zoukankan      html  css  js  c++  java
  • ReferenceTable overflow 问题汇总

    JNI层coding经常会遇到ReferenceTable overflow问题,特别是当jni函数被反复调用上千上万次的时候,现汇总如下,未完待续,并欢迎补充,(*^__^*) 嘻嘻……

    总体原则:释放所有对object的引用

    1.FindClass 

    例如,

    jclass ref= (env)->FindClass("java/lang/String");

    env->DeleteLocalRef(ref);

    2.NewString/ NewStringUTF/NewObject/NewByteArray

    例如,

    jstring     (*NewString)(JNIEnv*, const jchar*, jsize);    

    const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);

    void (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
    jstring     (*NewStringUTF)(JNIEnv*, const char*);    

    const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);

    void (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);
    env->DeleteLocalRef(ref);

    3.GetObjectField/GetObjectClass/GetObjectArrayElement

    jclass ref = env->GetObjectClass(robj);

    env->DeleteLocalRef(ref);

    4.GetByteArrayElements

    jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);

    (*env)->ReleaseByteArrayElements(env,jarray,array,0);

    4.const char* input =(*env)->GetStringUTFChars(env,jinput, &isCopy);

    (*env)->ReleaseStringUTFChars(env,jinput,input);

    5.NewGlobalRef/DeleteGlobalRef

     jobject     (*NewGlobalRef)(JNIEnv*, jobject);     

    void (*DeleteGlobalRef)(JNIEnv*, jobject);

    例如,

    jobject ref= env->NewGlobalRef(customObj);

    env->DeleteGlobalRef(customObj);


     

  • 相关阅读:
    无主之地1
    A+B Problem(V)
    取石子(七)
    又见拦截导弹
    【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"
    【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯
    【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
    对决
    重建二叉树
    花儿朵朵
  • 原文地址:https://www.cnblogs.com/CoolPigs/p/2388103.html
Copyright © 2011-2022 走看看