0

我对以下代码有一些疑问!我需要释放 mConnectEnv、s_jObj、jmethodConnect 吗?按照我在谷歌搜索的信息。我不需要发布 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 方法吗?

你什么都不需要。在 JNI 方法调用期间获得的所有jobjects内容都会在方法返回时自动释放。

于 2013-06-10T09:56:33.757 回答