gpt4 book ai didi

C 中的 Java jbytearray 访问(JNI)

转载 作者:行者123 更新时间:2023-11-29 05:39:25 25 4
gpt4 key购买 nike

我有一组 java 类,我在工作中需要用 C/C++ 运行。

而且,由于我对 Java 还很陌生,所以我一步一步来。我已经能够使用字符串、int double 等调用 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 初始化。它适用于简单类型,所以...)

jbyteArray jbyteData = (jbyteArray)jniEnvironment->GetObjectField(jobjRetData,
jniEnvironment->GetFieldID(clsReturn, "data", "Ljava/lang/ByteArray;"));

现在我随时访问 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.

最佳答案

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

然后在您的 JNI 方法中使用 GetFieldID(clsReturn, "data", "[B"));

编辑:为了能够获得每种类型的内部签名([B for byte[] 在你的情况下)你可以将您想要的字段声明为一个类(我们称它为 Test),编译它然后运行 ​​javap -s Test。它产生如下输出:

Compiled from "SimpleMain.java"
public class SimpleMain extends java.lang.Object{
public byte[] data;
Signature: [B // <-- signature shows the internal type
public SimpleMain();
Signature: ()V
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
}

关于C 中的 Java jbytearray 访问(JNI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18194364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com