相关疑难解决方法(0)

JNI附加/分离线程内存管理

我有一个JNI回调:

void callback(Data *data, char *callbackName){
    JNIEnv *env;
    jvm->AttachCurrentThread((void **)&env, NULL);
    /* start useful code*/

    /* end useful code */
    jvm->DetachCurrentThread();
}
Run Code Online (Sandbox Code Playgroud)

当我这样运行它(空的有用代码)时,我得到了内存泄漏.如果我注释掉整个方法,就没有泄漏.连接/拆卸螺纹的正确方法是什么?

我的应用程序处理实时声音数据,因此必须尽快完成负责数据处理的线程,以便为另一批处理做好准备.所以对于这些回调,我创建了新的线程.它们每秒都有几十甚至几百个,它们将自己附加到JVM,调用一个重新绘制图形,分离和死亡的回调函数.这是做这件事的正确方法吗?如何处理泄漏的内存?

编辑:错字

好的,我已经创建了一个所需的mimimal代码:

package test;

public class Start
{
    public static void main(String[] args) throws InterruptedException{
        System.loadLibrary("Debug/JNITest");
        start();
    }

    public static native void start();
}
Run Code Online (Sandbox Code Playgroud)

#include <jni.h>
#include <Windows.h>
#include "test_Start.h"

JavaVM *jvm;
DWORD WINAPI attach(__in  LPVOID lpParameter);

JNIEXPORT void JNICALL Java_test_Start_start(JNIEnv *env, jclass){
    env->GetJavaVM(&jvm);
    while(true){
        CreateThread(NULL, 0, &(attach), NULL, 0, NULL);
        Sleep(10);
    }
}


DWORD …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface

13
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×1

java-native-interface ×1