c(JNI)中的Java jbytearray访问

c(JNI)中的Java jbytearray访问,java,visual-c++,java-native-interface,jnienv,Java,Visual C++,Java Native Interface,Jnienv,我有一组java类,我的工作需要这些类在C/C++中运行 而且,由于我对java相当陌生,所以我一步一步地学习。我已经能够用string、intdouble等调用java,但是最终的结果将是返回一个字节数组(一个pdf文档),所以我尝试返回一个简单的两元素字节数组 以下是java: public class ReturnData { int returnValue; String Log; Byte[] data = new Byte[2]; public R

我有一组java类,我的工作需要这些类在C/C++中运行

而且,由于我对java相当陌生,所以我一步一步地学习。我已经能够用string、intdouble等调用java,但是最终的结果将是返回一个字节数组(一个pdf文档),所以我尝试返回一个简单的两元素字节数组

以下是java:

public class ReturnData
{
    int returnValue;
    String Log;
    Byte[] data = new Byte[2];

     public ReturnData(int nRetVal, String szLog)
     {
         this.data[0] = 100;
         this.data[1] = 12;
         this.returnValue = nRetVal;
         this.Log = szLog;
     }
}

这里是C++代码(JNI初始化被删除了。它适用于简单类型,所以…)

现在,每当我访问jbyteData元素时,例如:

jsize len = jniEnvironment->GetArrayLength(jbyteData);
我有个例外

System.AccessViolationException was unhandled
Message: Attempted to read or write protected memory. This is often an indication that other 
memory is corrupt.

对于FieldID,我想您应该使用
“[B”
,而不是
“Ljava/lang/ByteArray;”
,后者实际上不是一个类


编辑:由于您使用的是
Byte
类,而我在最初的响应中遗漏了该类,因此请使用“
[Ljava/lang/Byte;”
代替作为字段ID,我想您应该使用
“[B”
而不是
“Ljava/lang/ByteArray;”
,它实际上不是一个类


编辑:由于您使用的是
Byte
类,而我在最初的响应中没有使用该类,因此请使用“
[Ljava/lang/Byte;”

尝试将字段
Byte[]data=new Byte[2];
更改为
Byte[]data=new Byte[2];

然后在JNI方法中使用
GetFieldID(clsReturn,“data”,“B”);

编辑:为了能够获得每种类型的内部签名(
[B
对于
字节[]
,在您的情况下),您可以声明要作为类的字段(我们称之为
测试
),编译它,然后运行
javap-s测试
。它产生如下输出:

从“SimpleMain.java”编译而来
公共类SimpleMain扩展了java.lang.Object{
公共字节[]数据;

签名:[B/尝试将字段
字节[]数据=新字节[2];
更改为
字节[]数据=新字节[2];

然后在JNI方法中使用
GetFieldID(clsReturn,“data”,“B”);

编辑:为了能够获得每种类型的内部签名(
[B
对于
字节[]
,在您的情况下),您可以声明要作为类的字段(我们称之为
测试
),编译它,然后运行
javap-s测试
。它产生如下输出:

从“SimpleMain.java”编译而来
公共类SimpleMain扩展了java.lang.Object{
公共字节[]数据;

签名:[B//很好奇,这些数据类型字符串是在哪里定义的。我看了又看,找不到任何权威的来源,所以我只能看博客条目和网站问题。@saunderl我在我的答案中添加了一个
javap
执行的示例,以及生成的输出。请检查它。很好奇,这些数据类型在哪里定义了e字符串。我看了又看,找不到任何权威来源,所以我只能看博客条目和网站问题。@saunderl我用生成的输出在我的答案中添加了一个
javap
执行的示例。查看+1以显示如何使用字节。我真的需要切换到字节(您也回答了这个问题。)+1用于显示如何使用字节。我确实需要切换到字节(您也回答了)。请注意,如果
GetObjectField()的返回值
实际上已检查。请注意,如果实际检查了
GetObjectField()
中的返回值,则会立即检测到此问题。
System.AccessViolationException was unhandled
Message: Attempted to read or write protected memory. This is often an indication that other 
memory is corrupt.