2016-10-04 4 views
0

私はアセットフォルダのバイナリファイルを読まなければなりません。そして、私のjni側にファイルの内容を渡す必要があります。 Android側では値を印刷する必要がありますが、アプリが起動するとクラッシュします。ビンファイルを読んでjniにコンテンツを送ってください

いくつかのアドバイスはありますか? ありがとうございます。

JNI C/C++ SIDE

 typedef struct struct_APP_CONFIG *ptr_sAPP_CONFIG; 
     APP_CONFIG *AppConfig_struct; 
     ptr_sAPP_CONFIG ptr_AppConfig; 
     char value; 

     int uploadCnfdf(char *ptr_tmpString){ 

      ptr_AppConfig = (ptr_sAPP_CONFIG) calloc(1, (sizeof(APP_CONFIG))); 
      memcpy((void *)ptr_AppConfig,(const void *)ptr_tmpString,sizeof(APP_CONFIG)); 

      return sizeof(APP_CONFIG); 

     } 

      JNIEXPORT void JNICALL Java_test_MainActivity_sendData(JNIEnv* env, jbyteArray data) { 

      //COPY ARRAY FROM JAVA 
      jbyte *buffer = env->GetByteArrayElements(data, NULL); 
      jsize len = env->GetArrayLength(data); 
      env->ReleaseByteArrayElements(data, buffer, 0); 

      //CONVERT ARRAY TO CHAR 
      unsigned char *buf = new unsigned char[len]; 
      env->GetByteArrayRegion((jbyteArray) buffer, 0, len, reinterpret_cast<jbyte *>(buf)); 
      //CALL FUNCTION 
      uploadCnfdf((char *) buffer); 
//SISTEM.MAX is a char type and its value is 5 
      value = ptr_AppConfig->setup.setup_map.MEMORY.SETUP.TABLE_SETUP.SISTEM.MAX; 
      } 
    jstring 
    Java_test_MainActivity_stringFromJNI(
      JNIEnv *env, 
      jobject /* this */) { 

      return env->NewStringUTF((const char *) value); 

    } 

アンドロイド/ Java側

 public class MainActivity extends AppCompatActivity { 


      static { 
       System.loadLibrary("native-lib"); 
      } 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
       try { 
        readBin(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       // Example of a call to a native method 
       TextView tv = (TextView) findViewById(R.id.sample_text); 
       tv.setText(stringFromJNI()); 
      } 


      void readBin() throws IOException { 
       AssetManager am = getAssets(); 
       InputStream file = am.open("file.bin"); 
       byte [] filebytes = new byte[file.available()]; 
       //String str = new String(filebytes); 
       //String chars = filebytes.toString(); 
       file.read(filebytes); 
       file.close(); 
try { 
      sendData(filebytes); 

     } catch (Exception e) { 
      e.getMessage(); 
     }   } 

      public native String stringFromJNI(); 
      private native void sendData(byte[] data); 
     } 

LOGのCAT

0-04 15:20:06.163 728-728/java.app_android A/art: art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: jarray argument has non-array type: java.app_android.MainActivity 
10-04 15:20:06.163 728-728/java.app_android A/art: art/runtime/check_jni.cc:65]  in call to GetByteArrayElements 
10-04 15:20:06.163 728-728/java.app_android A/art: art/runtime/check_jni.cc:65]  from void java.app_android.MainActivity.sendData(byte[]) 
10-04 15:20:06.163 728-728/java.app_android A/art: art/runtime/check_jni.cc:65] "main" prio=5 tid=1 Runnable 
10-04 15:20:06.163 728-728/java.app_android A/art: art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x7485f000 self=0xb7ca9800 
+0

logcat for crashレポートを表示します。 – greenapps

+0

'String chars = filebytes.toString();'。その文を削除することができます。 – greenapps

+0

'file.read(ファイルバイト);'。読み込まれるバイト数を示す戻り値があります。これを使って。 – greenapps

答えて

1

JNIEnv* env, jbyteArray dataは、C++の関数のための正しい引数の仕様ではありません。それには、常にネイティブメソッドが呼び出されているJavaオブジェクトまたはクラスへの参照を保持する2つの引数(それに加えて、それに渡す余分な引数)、つまりJNIEnv*jobject/jclassがあります。

ので、sendDataは次のようになります。

JNIEXPORT void JNICALL Java_test_MainActivity_sendData(JNIEnv* env, 
                 jobject thiz, 
                 jbyteArray data) { 

そして、それはそれはしてきただろうJava側にstatic宣言されたか:

JNIEXPORT void JNICALL Java_test_MainActivity_sendData(JNIEnv* env, 
                 jclass clazz, 
                 jbyteArray data) { 

ログは、部分的に、あなたにこれを言っていますjarray argument has non-array type: java.app_android.MainActivitysendDataには、が2番目の引数としてMainActivityインスタンスへの参照を受け取りました指定されたd。

+0

"jobject thiz"というアプリケーションがまだクラッシュしています:/ –

+0

まあ、ちょっとしたことを言わずにクラッシュしていると言ってもあまり役に立ちません。 – Michael

+0

このタイプのエラーが発生しました クラッシュの開始 10-04 17:04:57.926 25344-25344/java.app_android A/libc:Fatal signal 6(SIGABRT)、 25344のコード-6(java.app_android) 10-04 17:04:58.769 257-257 /? E/lowmemorykiller:エラーオープン/ proc/25344/oom_score_adj; errno = 2 10-04 17:04:58.796 1208-1624 /? E/WindowState:getStack:Window {24336dd9 u0 java.app_androidを起動するとtaskId = 805を見つけることができませんでしたCallers = com.android.server.wm.WindowManagerService ... ' –

関連する問題