0

以下のコードについて質問があります。mConnectEnv、s_jObj、jmethodConnect を解放する必要がありますか? Googleで検索した情報に従ってください。jmethodConnect をリリースする必要はありませんが、 mConnectEnv と s_jObj はどうですか? したがって、j_ip をリリースするときに deleteLocalRef を使用しましたが、この方法は間違っていると思います。ReleaseStringUTF メソッドを使用する必要がありますか?

static JNIEnv* mConnectEnv = 0;
static jobject s_jObj;
static jmethodID jmethodConnect;
.............(JNIEnv* env, jobject obj)
{
   mConnectEnv = env;
   jclass s_jclass = (jclass)(*mConnectEnv)->GetObjectClass(mConnectEnv, obj);
   s_jObj = (*mConnectEnv)->NewGlobalRef(mConnectEnv, obj);

   jmethodConnect = (*mConnectEnv)->GetMethodID(mConnectEnv, s_jclass , "Connect", "(Ljava/lang/String;I)Z");
..............
}
int OpenConnection(char* ip, int port)
{
    LOG_INFO("OpenConnectionat jni layer");
    jstring j_ip = (*mConnectEnv)->NewStringUTF(mConnectEnv, ip);
    int result = (*mConnectEnv)->CallBooleanMethod(mConnectEnv, s_jObj, jmethodConnect, j_ip, port);
    (*mConnectEnv)->DeleteLocalRef(mConnectEnv, j_ip);
    return result;
}
4

1 に答える 1

3

mConnectEnv、s_jObj、jmethodConnect を解放する必要がありますか?

static JNIEnv* mConnectEnv = 0;
static jobject s_jObj;
static jmethodID jmethodConnect;
  • mConnectEnv: いいえ、これはコードの誤機能です。JNIEnv * は、あなたではなく JNI によって提供されます。これを静的変数に格納するべきではありません。JNI 呼び出しで提供されたものを使用するか、呼び出しAttachCurrentThread()て新しい変数を取得する必要があります。
  • s_jObj: はい。でしばらく解放する必要がありますDeleteGlobalRef()
  • jMethodConnect: 番号。MethodID はオブジェクトではないため、解放する必要はありません。

したがって、j_ip をリリースするときに deleteLocalRef を使用しましたが、この方法は間違っていると思います。ReleaseStringUTF メソッドを使用する必要がありますか?

何もする必要はありません。jobjectsJNI メソッドの呼び出し中に取得したものはすべて、メソッドが戻るときに自動的に解放されます。

于 2013-06-10T09:56:33.757 に答える