我想从JNI访问java函数(收发)。不幸的是,我收到消息错误,当从IsoDep.java调用收发功能时,app已停止
如何以参数形式调用收发函数并以字节数组的形式输出?
请帮帮我,谢谢。
JMain.java
Class JMain {
static {
System.loadLibrary("Native");
}
public native byte[] ReadData();
}
IsoDep.java
public byte[] transceive(byte[] data) throws IOException {
//
}
Native.cpp
#include <jni.h>
#include <iostream>
#ifdef __cplusplus
extern "C" {
#endif
JNIEnv *JNI_GetEnv() {
//
}
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *jvm, void *reserved) {
//
}
jbyteArray SendReq(jobject isoDep, jbyteArray b) {
// PROBLEM IN HERE..
// Error unfortunately, app has stopped when call transceive function
// from IsoDep.java
jbyte *args = e->GetByteArrayElements(b, NULL);
return (jbyteArray) e->CallObjectMethodA(isoDep, _midTransceive, (jvalue *) args);
}
JNIEXPORT jbyteArray JNICALL
Java_com_company_appname_JMain_ReadData(JNIEnv *env, jobject obj) {
//
}
#ifdef __cplusplus
}
#endif
答案 0 :(得分:0)
您的transceive
方法需要Java字节数组引用(jbyteArray
/ jobject
)作为参数,而不是C ++ jbyte指针(jbyte*
)。
当您使用GetByteArrayElements
对字节数组的内容进行extraxt时,您会得到一些只能在本机代码中使用的东西而不是有效的Java引用(并且将该非引用传递给Java方法是什么让你的程序崩溃)。省略该步骤并直接传递b
。