gpt4 book ai didi

c - jni-wrapper 在 Windows 上使 JVM 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:17 25 4
gpt4 key购买 nike

我写了一个 JNI-Wrapper,但直到今天只在 Linux 上使用它。现在我为 Windows 编译了它,JVM 在这个本地方法中崩溃了:如果我删除 ReleaseStringUTFCharsfree 调用它也适用于 Windows,但有趣的是为什么它适用于 linux 但不适用于 Windows?(我使用 Windows 10-64 位).根据我的经验,这个调用是强制性的,在我正确释放它们之前有一些内存泄漏(在 linux 上)

void onMessageReceived(char* topic, char* timestamp, char* id, char* value) {
JNIEnv * g_env;
int getEnvStat = (*g_vm)->GetEnv(g_vm, (void **) &g_env, JNI_VERSION_1_8);
if (getEnvStat == JNI_EDETACHED) {
if ((*g_vm)->AttachCurrentThread(g_vm, (void **) &g_env, NULL) != 0) {
puts("Failed to attach");
fflush(stdout);
}
}

if (methodHandleMessage) {
} else {
jclass clazz = (*g_env)->GetObjectClass(g_env, store_callback);
methodHandleMessage = (*g_env)->GetMethodID(g_env, clazz, "handleMessage", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
}
jstring j_topic = (*g_env)->NewStringUTF(g_env, topic);
jstring j_timestamp = (*g_env)->NewStringUTF(g_env, timestamp);
jstring j_value = (*g_env)->NewStringUTF(g_env, value);
jstring j_id = (*g_env)->NewStringUTF(g_env, id);


(*g_env)->CallVoidMethod(g_env, store_callback, methodHandleMessage, j_topic, j_timestamp, j_id, j_value);

//HERE IS THE PROBLEM:
(*g_env)->ReleaseStringUTFChars(g_env, j_topic, topic);
(*g_env)->ReleaseStringUTFChars(g_env, j_timestamp, timestamp);
(*g_env)->ReleaseStringUTFChars(g_env, j_value, value);
(*g_env)->ReleaseStringUTFChars(g_env, j_id, id);
//

(*g_vm)->DetachCurrentThread(g_vm);
}

void rep_actor(zsock_t *pipe, void *args) {
zsock_signal(pipe, 0);
while (!zsys_interrupted) {
char* timestamp;
char* sender;
char* command;
char* message;

zsock_recv(reply, "ssss", &timestamp, &sender, &command, &message);

char* result = onRequestReceived(timestamp, sender, command, message);
zsock_send(reply, "s", result);

//HERE IS THE PROBLEM:

free(timestamp);
free(sender);
free(command);
free(message);
free(result);
//

}
}

最佳答案

错误的发生是因为你释放了两次内存。第一次 - 通过在 onMessageReceived() 内部调用 ReleaseStringUTFChars(),第二次 - 在 onMessageReceived() 外部调用 free() 在每个释放的指针上。

重要
您不需要为在 Java 环境中创建的对象手动释放内存(调用 env->New*() 方法)。在你的情况下:

// j_topic - it's a pointer for object inside of java heap
// garbage collector will free this memory
jstring j_topic = env->NewStringUTF(topic);

调用 ReleaseStringUTFChars() 在这里是不合适的。这仅在您使用 GetStringUTFChars() 从 java String 创建 native 字符串 时使用:

// j_topic - string inside of java heap
const char* native_str = env->GetStringUTFChars(j_topic, isCopy);

// your logic for native_str array

// informs the VM that the native code no longer needs access to native_str
env->ReleaseStringUTFChars(j_topic, native_str);

javadoc对于方法 GetStringUTFChars()ReleaseStringUTFChars() - 你应该只一起使用它们。

关于c - jni-wrapper 在 Windows 上使 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45976075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com