当我建立一个线程来调用JNI C ++函数时,程序崩溃了

时间:2018-11-18 09:32:29

标签: java android c++ java-native-interface

我想在子线程中使用这三个函数,但是程序崩溃了。

这是树C ++函数:

woff2

这三个函数可以在android程序中正确使用,但是当我构建一个子线程并使用这三个函数时,程序崩溃了。

通过测试,似乎该行崩溃了,结果无法返回。

//here are three JNI interface 
public native byte[] readImage(String str);
public native byte[] FPGAEnhancement(String str, int flag);
public native byte[] FPGASobel(String str, int flag);

这是readImage函数:

env->SetByteArrayRegion(jarrRV, 0, length, data);

我想我在子线程中调用C ++函数的方式可能有些问题,但是我不知道它到底是什么。谢谢!!

1 个答案:

答案 0 :(得分:1)

当图像文件很大时,在堆栈上分配 data [length] 可能会耗尽堆栈,并导致崩溃。实际上,您实际上根本不需要此数组,可以安全地直接访问新创建的 jarrRV 的字节:

    jbyteArray jarrRV = env->NewByteArray(length);
    jboolean isCopy;
    jbyte data = env->GetByteArrayElements(env, jarrRV, &isCopy);
    readImage(fp, data, length);
    fclose(fp);
    env->ReleaseByteArrayElements(jarrRV, data, 0);

关于您的C ++代码的其他注释:

  • 在某些情况下,该文件似乎不会关闭。
  • 在所有情况下, jstringTostring()都可能泄漏本机和Java对象。请不要低估这种泄漏在多线程环境中的影响。