【问题标题】:JNI converting native unsigned char arry to jbyte arrayJNI 将本机 unsigned char 数组转换为 jbytearray
【发布时间】:2013-11-11 09:37:47
【问题描述】:

Í 有需要返回一个 jbyte 数组的 JNI 函数。该数组包含带有数据的 c 结构的字节数据。但是当我将数据从 unsinged char 数组传递到 jbyte 数组时出现错误。

C结构体定义如下:

// ObjectInfo struct definition
 struct ObjectInfo {
    int ObjectXCor;
    int ObjectYCor;
    int ObjectMass;
 };

 // ObjectInfo struct definition
 struct SensorDataStruct{
    int PingData;
    int IRData;
    int ForceData;
    int CompassData;
 };

 // ObjectInfo struct definition
 union PackedSend{
    struct CommStruct{
        ObjectInfo VisionData;
        SensorDataStruct SensorData;
    } CommData;
    unsigned char bytes[28];
 }SendData;

JNI方法定义如下:

JNIEXPORT jbyteArray JNICALL Java_com_example_communicationmodule_MainActivity_Convert(
    JNIEnv *env, jobject,
    jint var1,
    jint var2,
    jint var3,
    jint var4,
    jint var5,
    jint var6,
    jint var7)
{
// Array to fill with data
jbyteArray Array;

// Init  java byte array
Array = env->NewByteArray(28);

SendData.CommData.SensorData.PingData = var1;
SendData.CommData.SensorData.IRData = var2;
SendData.CommData.SensorData.ForceData = var3;
SendData.CommData.SensorData.CompassData = var4;
SendData.CommData.VisionData.ObjectXCor = var5;
SendData.CommData.VisionData.ObjectYCor = var6;
SendData.CommData.VisionData.ObjectMass = var7;

//Put the native unsigned chars in the java byte array
for(int Index=0; Index < 28; Index++){
    Array[Index] = SendData.bytes[Index];

}


// Return java array
return Array;
}

我得到的错误是: jni/HelperFunctions.cpp:44:38: error: no match for 'operator=' in '*(Array + ((unsigned int)Index)) = SendData.PackedSend::bytes[Index]'

我的问题是将原生 unsigned char 数组转换为 jbyte 数组的正确方法是什么?有没有任何男孩有建议?欢迎所有提示!

更新

转换为 (jbyte) 后,我收到以下错误: jni/HelperFunctions.cpp:54:46: 错误: '*(Array + ((unsigned int)Index)) = (jbyte)SendData.PackedSend::bytes[Index]' 中的 'operator=' 不匹配 jni/HelperFunctions.cpp:54:46: 注意:候选人是: C:/android-ndk-r9/platforms/android-8/arch-arm/usr/include/jni.h:66:7: 注意:_jbyteArray& _jbyteArray::operator=(const _jbyteArray&)

铸造代码如下:

//Put the native unsigned chars in the java byte array
for(int Index=0; Index < 28; Index++){
    Array[Index] = (jbyte) SendData.bytes[Index];
}

有人有什么想法或建议吗?欢迎一切!

【问题讨论】:

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


    【解决方案1】:
    env->SetByteArrayRegion(Array, 0, 28, (jbyte*)SendData.bytes)
    

    【讨论】:

    • 您好,感谢您的评论!我需要用 memcopy 投射吗?像这样:memcpy(Array, (jbyte)SendData.bytes, 28).
    • @afpro:当我转换为 jbyte 时,我得到以下错误:jni/HelperFunctions.cpp:54:46:错误:'*(Array + (( unsigned int)Index)) = (jbyte)SendData.PackedSend::bytes[Index]' jni/HelperFunctions.cpp:54:46: 注意:候选是:C:/android-ndk-r9/platforms/android-8/ arch-arm/usr/include/jni.h:66:7: 注意:_jbyteArray& _jbyteArray::operator=(const _jbyteArray&)。我将在更新我的原始帖子时使用铸造代码更新我的帖子。
    • 哦,那是我的错。使用env-&gt;SetByteArrayRegion(Array, 0, 28, (jbyte*)SendData.bytes)
    • jbyteArray不能被'[]'访问,这是一个指针,必须被'JNIEnv'访问
    • 谢谢大家,感谢您的帮助,我已经解决了这个问题。再次感谢!
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2011-10-19
    • 2013-09-23
    相关资源
    最近更新 更多