私はJNI-Wrapperを書いていますが、今日までLinuxでのみ使用しています。 これをWindows用にコンパイルし、このネイティブメソッドでJVMがクラッシュする: ReleaseStringUTFChars
とfree
という呼び出しを削除すると、Windowsでも動作しますが、Linuxでは動作しますがWindowsでは動作しないのはなぜですか? 10-64ビット)。私が正しくWindows上でjni-wrapperがJVMをクラッシュする
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", ×tamp, &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);
//
}
}
ありがとうございます。私はメモリを2回解放するとクラッシュすることはありません – user2071938