当前位置: 首页 > 知识库问答 >
问题:

c语言中的Java jbytearray访问(JNI)

夏骏
2023-03-14

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

而且,由于我对java还很陌生,所以我要一步一步地走。我已经能够用string、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;
     }
}
jbyteArray jbyteData = (jbyteArray)jniEnvironment->GetObjectField(jobjRetData,
    jniEnvironment->GetFieldID(clsReturn, "data", "Ljava/lang/ByteArray;"));
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.

共有1个答案

齐航
2023-03-14

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

然后在JNI方法中使用getFieldId(clsReturn,“data”,“[b”));

编辑:为了能够获得每个类型的内部签名(在您的示例中,[bforbyte[]),您可以向类声明您想要的字段(我们称之为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
}
 类似资料:
  • 指针越界访问举例 我们都知道const修饰的是一个常量,是不可以被改变的量。但是在C语言中,它也许是一个中看不中用的修饰符。它是希望我们不去改变它的值,但是实际上C却不能阻止我们去修改它。和C++,Java不同,C++中的const就不能被改变。C中就并没有这种强化,当然也有它的道理。下面我们来看一个例子操作一下const常量: 测试代码如下 我们试图去修改一个常量的值。 运行结果如下 由于我们已

  • Hyperledger Composer包含一个访问控制语言(ACL),提供对领域模型元素的声明式访问控制。通过定义ACL规则,你可以确定允许哪些用户/角色在业务网络的领域模型中创建、读取、更新或删除元素。 网络访问控制 Hyperledger Composer区分业务网络(业务访问控制)内的资源的访问控制和网络管理变更(网络访问控制)的访问控制。业务访问控制和网络访问控制都在业务网络的访问控制文

  • 考虑以下层次结构: 访客类: 通常,当重载方法依赖于参数类型时,我使用访问者模式来实现双重调度,但我只有指向基类的指针。 例如: 我认为这是实现双重调度的唯一方法,因为虚拟函数的动态绑定应该只发生在调用方法的对象上,而不是其参数(派生类型)上。 现在我遇到了一个新情况,我需要一种在多个参数上重载的Visit方法。类似于这样: 我不能使用经典的访问者模式解决方案,因为接受方法只对其中一个参数调用。

  • 有人知道RSACryptoServiceProvider使用哪种签名算法吗。签名杂凑?我相信它是RSAPKCS1,它还安全吗? 有没有人想过将RSASSA-PSS配置为RSACryptServiceProvider的签名算法,而不使用像BouncyCastle这样的第三方库? 提前谢谢。

  • 我们有些时候需要使用一些固定的名称来代表固定的数值,比如在计算你的课程成绩的时候,有的课程会出现用英文字母 A-F 来打分,这个时候你需要换算为一个固定的分值来计算平均分。要实现这个功能,你可以选择在程序的开始定义一系列的常量,但是这样的定义会非常繁琐,而且不方便维护。这个时候就出现了一种变量的类型,枚举。 1. 声明 enum 声明一个枚举类型,可以采用关键字 enum 加上一个自定义的名称,再

  • 由于 C 语言是强类型语言,不能如同某些语言一样,可以在变量中存储任意元素。所以在有的时候会遇到一些问题。比如你有一个变量需要存储计算结果,计算结果有时可能是整数,有时可能是浮点数。这里我们介绍其中可以做到不更改变量名就可以存储不同类型数据的变量。 1. 声明 union 和之前介绍的 struct 的声明方式是类似的,通过关键字 union ,以及这个 union 的名称,还有一系列的变量类型以