【问题标题】:Crash while returning from android ndk function on Samsung Galaxy S2从三星 Galaxy S2 上的 android ndk 功能返回时崩溃
【发布时间】:2012-01-13 01:31:50
【问题描述】:

从三星 Galaxy S2 上的 android ndk 功能返回时崩溃。 在我的 java 代码中,我调用了一个 NDK 函数,有时(这可能是 20 个随机案例之一)应用程序在从 NDK 返回后立即挂起(ANR)。日志说

12-05 04:19:59.760: D/AndroidRuntime(5607): 关闭 VM 12-05 04:19:59.760: W/dalvikvm(5607): threadid=1: 线程以未捕获的异常退出 (group=0x40015578) 12-05 04:19:59.775: W/dalvikvm(5607): threadid=14: 线程以未捕获的异常退出 (group=0x40015578)

有时会在这发生之前执行几行 java 代码。我已经尝试完全清除 NDK 功能并从中删除所有参数,但无济于事。该函数是从一个单独的 java 线程调用的。 在其他手机(HTC Desire HD、HTC Legend 等)上我没有看到这个问题。

这是我的java代码,调用ndk函数:

私有静态本机无效ndkFunctionN( 字节[] 文件路径1N,字节[] 文件路径2N, byte[] filePath3N, byte[] tmpDirN, JavaClass callerN, 字节[] 参数 5N,字节[] 参数 6N,字节[] 参数 7N); 公共静态无效javaFunction( 文件file1,文件file2,文件file3,字符串tmpDir, JavaClass caller, String param5, String param6, String param7) { 尝试 { byte[] filePath1N = file1.getPath().getBytes("UTF-8"); byte[] filePath2N = file2.getPath().getBytes("UTF-8"); byte[] filePath3N = file3.getPath().getBytes("UTF-8"); byte[] tmpDirN = tmpDir.getBytes("UTF-8"); byte[] param5N = appClassName.getBytes("UTF-8"); byte[] param6N = param6.getBytes("UTF-8"); byte[] param7N = param7.getBytes("UTF-8"); 合并和转储N( 文件路径1N,文件路径2N,文件路径3N,tmpDirN, 调用者,param5N,param6N,param7N); } 捕捉(UnsupportedEncodingException e){ 我的日志.e(e); } }

这是 C++ 代码:

JNIEXPORT 无效 JNICALL Java_com_package_name_ClassName_ndkFunctionN ( JNIEnv* 环境,工作对象, jbyteArray filePath1N, jbyteArray filePath2N, jbyteArray filePath3N, jbyteArray tmpDirN, jobject callerN, jbyteArray param5N, jbyteArray param6N, jbyteArray param7N) { }

【问题讨论】:

    标签: java android android-ndk


    【解决方案1】:

    这可能是由于并发访问。

    HTC Desire HD 和 HTC Legend 是单核处理器,因此您可以确保两个线程不会同时访问您的数据。

    S2 有 2 个 cortex-A9 单元。如果您启动超过 1 个可以调用相同 NDK 函数的线程,最好看看如果 2 个进程处理相同的数据会发生什么。

    【讨论】:

      【解决方案2】:

      也许,在您的单独线程中,您仍然使用与第一个线程中相同的 JNIEnv 值?您必须调用 g_JavaVM->AttachCurrentThread(&env, NULL); 或类似的方法才能为您的其他线程获取正确的 JNIEnv。您应该以同样的方式使用新的 JNIEnv 值重新查找所有类/方法

      【讨论】:

      • 也许我有些不明白。但是从 ndk 函数返回后,我不保存 env。而且我不会在 ndk 中创建新线程。而且我不做并行调用。同一时间只能打一个电话。 IE。每次调用中的环境都必须是新的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      相关资源
      最近更新 更多