我正在尝试使用带有几个字段的实用类将数据从JAVA传递到C ++。其中一个是字节数组。
我很难从JNI中的jobject获取字节数组字段。我可以正确获取对象和字段ID但我无法获取jbyteArray。我的代码导致SIGSEGV信号。
这是我传递给本机调用的Java类:
public class T011Data {
public char chTransRes;
public byte[] btFormat;
}
这是本机功能:
T011Data data = new T011Data();
data.chTransRes = 12;
data.btFormat = new byte[]{0x20,0x21,0x22,0x23,0x24};
PrkPxy.SerializeT011(data);
这是我的C ++实现
JNIEXPORT jint JNICALL Java_javax_pos_prk_PrkPxy_SerializeT011(JNIEnv *env, jclass obj, jobject jobT011Data){
T011Data srCmdData;
srCmdData.chTransResult = chGetCharField(env,jobT011Data,"chTransRes");
srCmdData.inFormatLen = inGetByteArrayField(env,jobT011Data,"btFormat",srCmdData.pchFormat);
delete srCmdData.pchFormat;
}
这是一个从对象中提取字节数组字段的实用函数。它导致了SIGSEGV:
int inGetByteArrayField(JNIEnv * env, jobject jobData, char * pchFieldID, char * pchOutput){
jclass jcClass = env->GetObjectClass(jobData);
jfieldID jfArrayId = env->GetFieldID(jcClass, pchFieldID, "[B");
jobject jobArray = env->GetObjectField(jcClass, jfArrayId);
jbyteArray * arr = reinterpret_cast<jbyteArray *>(&jobArray);
//This line is causing a SIGSEGV!!!
char * pchData = (char *)env->GetByteArrayElements(*arr, NULL);
int inArrayLen = env->GetArrayLength(*arr);
pchOutput = new char[inArrayLen];
memcpy(pchOutput,pchData,inArrayLen);
env->ReleaseByteArrayElements(*arr, (jbyte *) pchData, 0);
return inArrayLen;
}
我检查了字段ID值,它不为零。
我真的很感激任何帮助。
提前谢谢!