私はアセットフォルダのバイナリファイルを読まなければなりません。そして、私の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
logcat for crashレポートを表示します。 – greenapps
'String chars = filebytes.toString();'。その文を削除することができます。 – greenapps
'file.read(ファイルバイト);'。読み込まれるバイト数を示す戻り値があります。これを使って。 – greenapps