gpt4 book ai didi

java - 读取bin文件并将内容发送到jni

转载 作者:行者123 更新时间:2023-11-30 15:05:24 24 4
gpt4 key购买 nike

我必须读取 Assets 文件夹中的二进制文件,并且必须将文件的内容传递到我的 jni 端,以便使用 c 结构提取一些信息。在 Android 端,我必须打印值,但是当应用程序启动时它会崩溃。

有什么建议吗?提前致谢。

JNI C/C++ 端

        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);
}

日志猫

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

最佳答案

JNIEnv* env, jbyteArray data 不是 C++ 函数的正确参数规范。它始终会接收两个参数(加上您传递给它的任何额外参数):一个 JNIEnv* 和一个保存引用的 jobject/jclass调用 native 方法的 Java 对象或类。

因此,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 参数具有非数组类型:java.app_android.MainActivity 部分告诉您这一点。这里告诉您 sendData 收到了对一个 MainActivity 实例作为其第二个参数,其中它期望一个 jbyteArray 因为这是您指定的。

关于java - 读取bin文件并将内容发送到jni,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com