2011-12-05 8 views
1

サムスンギャラクシーS2のアンドロイドndk機能から復帰中にクラッシュします。 私のJavaコードでは、NDK関数を呼び出し、NDKから返された直後にアプリケーションがハングアップする(これは20のランダムなケースの1つです)場合があります(ANR)。ログには、この問題が発生する前にJavaコードのサムスンギャラクシーS2のアンドロイドndk機能から復帰中にクラッシュする

 
12-05 04:19:59.760: D/AndroidRuntime(5607): Shutting down VM 
12-05 04:19:59.760: W/dalvikvm(5607): threadid=1: thread exiting with uncaught exception (group=0x40015578) 
12-05 04:19:59.775: W/dalvikvm(5607): threadid=14: thread exiting with uncaught exception (group=0x40015578) 

時には数行が実行されていると言います。私はNDK関数を完全にクリアして、すべてのパラメータを無駄に取り除こうとしました。この関数は別のJavaスレッドから呼び出されます。 他の携帯電話で(HTC Desire HD、HTC Legendなど)私はこの問題を見ていません。

これはNDK関数を呼び出す私のJavaコード、次のとおりです。

 

    private static native void ndkFunctionN(
      byte[] filePath1N, byte[] filePath2N, 
      byte[] filePath3N, byte[] tmpDirN, JavaClass callerN, 
      byte[] param5N, byte[] param6N, byte[] param7N); 


    public static void javaFunction(
      File file1, File file2, File file3, String tmpDir, 
      JavaClass caller, String param5, String param6, String param7) 
    { 
     try { 
      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"); 

      mergeAndDumpN(
        filePath1N, filePath2N, filePath3N, tmpDirN, 
        caller, param5N, param6N, param7N); 
      } catch (UnsupportedEncodingException e) { 
       MyLog.e(e); 
      } 
    } 

これは、C++コードです:あなたはまだ同じJNIEnvの値を使用しているあなたの別のスレッドでおそらく

 
    JNIEXPORT void JNICALL Java_com_package_name_ClassName_ndkFunctionN (
     JNIEnv* env, jobject thiz, 
     jbyteArray filePath1N, jbyteArray filePath2N, 
     jbyteArray filePath3N, jbyteArray tmpDirN, 
     jobject callerN, jbyteArray param5N, 
     jbyteArray param6N, jbyteArray param7N) 
    { 
    } 

答えて

1

、あなたは最初のスレッドに入っていますか?他のスレッド用に正しいJNIEnvを取得するには、g_JavaVM->AttachCurrentThread(&env, NULL);またはそれに類似するものを呼び出す必要があります。その新しいJNIEnv値を使用して、すべてのクラス/メソッドをリファインするのと同じ方法です。

+0

多分私は何かを理解していません。しかし、私はenvを保存しない、ndk関数から復帰した後。そして、私はndkに新しいスレッドを作成しません。私はパラレルコールをしません。同時に1つのコールのみ。 I. Envはすべての呼び出しで新しいものでなければなりません。 – willir

0

これは同時アクセスが原因である可能性があります。

HTC Desire HDとHTC Legendはモノラルコアプロセッサなので、2つのスレッドが同時にデータにアクセスしないようにすることができます。

S2は2つの皮質-A9単位を有する。同じNDK関数を呼び出すことができる2つ以上のスレッドを起動すると、2つのプロセスが同じデータで動作する場合、何が起こるかを知ることは良い考えです。

関連する問題