JNI GetByteArrayElements在从对象字段获取字节时导致SIGSEGV

时间:2016-02-27 02:46:39

标签: java c++ java-native-interface

我正在尝试使用带有几个字段的实用类将数据从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值,它不为零。

我真的很感激任何帮助。

提前谢谢!

0 个答案:

没有答案