JNI GetByteArrayElements在从对象字段获取字节时导致SIGSEGV 我试图通过使用一个有两个字段的UTI类将数据从java传递到C++。其中之一是字节数组

JNI GetByteArrayElements在从对象字段获取字节时导致SIGSEGV 我试图通过使用一个有两个字段的UTI类将数据从java传递到C++。其中之一是字节数组,java,c++,java-native-interface,Java,C++,Java Native Interface,我很难从JNI中的jobject获取字节数组字段。我可以正确获取对象和字段ID,但无法获取jbyteArray。我的代码会产生SIGSEGV信号 这是我传递给本机调用的Java类: public class T011Data { public char chTransRes; public byte[] btFormat; } 这是本机函数调用: T011Data data = new T011Data(); data.chTransRes = 12; dat

我很难从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++实现< /P>

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; 
}
int-inGetByteArrayField(JNIEnv*env,jobject-jobData,char*pchFieldID,char*pchOutput){
jclass-jclass=env->GetObjectClass(作业数据);
jfieldID jfArrayId=env->GetFieldID(jcClass,pchFieldID,“[B”);
jobject jobArray=env->GetObjectField(jcClass,jfArrayId);
jbyterarray*arr=重新解释强制转换(&jobArray);
//这条线引起了SIGSEGV!!!
char*pchData=(char*)env->GetByteArrayElements(*arr,NULL);
int inaraylen=env->GetArrayLength(*arr);
pchOutput=新字符[inaraylen];
memcpy(pchOutput、pchData、inaraylen);
环境->发布依据附件(*arr,(jbyte*)pchData,0);
返回伊纳拉伦;
}
我检查了字段id值,它不是零

我真的很感激任何帮助


提前感谢!

结果是行jobject jobArray=env->GetObjectField(jcClass,jfArrayId);是错误的:我应该将jobData作为第一个参数而不是jcClass来传递。是的,差不多是这样说的。您的IDE是否有函数签名提示或等效项?同样,通过正确的错误处理,JNI库函数不应该出错,因为您可以避免传递无效参数。结果是行jobject jobArray=env->GetObjectField(jcClass,jfArrayId);错误:我应该将jobData作为第一个参数传递,而不是jcClass。是的,非常清楚。您的IDE是否有函数签名提示或等效项?同样,通过正确的错误处理,JNI库函数不应该出错,因为您可以避免传递无效参数。