Мне нужно прочитать двоичный файл в папке с моими активами, и мне нужно передать содержимое файла на мою сторону jni, чтобы извлечь некоторую информацию в c struct. На стороне Android мне приходится печатать значения, но когда приложение запускается, он падает.Чтение файла bin и отправка содержимого в 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);
}
ANDROID/JAVA SIDE
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
Показать лог-код для отчета о сбое. – greenapps
'String chars = filebytes.toString();'. Вы можете удалить этот оператор. – greenapps
'file.read (filebytes);'. Появится возвращаемое значение, сообщающее вам, сколько байтов считывается. Используй это. – greenapps