1

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

而且,由于我对 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.
4

2 回答 2

2

对于 FieldID,我认为您想使用"[B"而不是"Ljava/lang/ByteArray;",这实际上不是一个类。

编辑:由于您正在使用Byte我在原始回复中错过的课程,请使用 "[Ljava/lang/Byte;"代替

于 2013-08-12T18:52:01.207 回答
2

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

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

编辑:为了能够获得每种类型的内部签名([Bbyte[]您的情况下),您可以将您想要的字段声明为一个类(让我们称之为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
}
于 2013-08-12T19:00:04.140 回答