java - 从 Java 端访问数组

标签 java c++ java-native-interface

我在 java 类中有一个方法,调用它来设置该类的一个字段。该字段的类型为“char []。当我尝试访问 char []` 的元素时,我的程序将崩溃。

jni代码:

mid = env->GetMethodID(cls,"setData","([C)V");
env->CallVoidMethod(obj,mid,MyClass.Data)   //MyClass.Data: unsigned char Data [8];

java代码:

public void setData(char[] data2) {    //Data: char [] Data = new char [8];
    System.out.println("In Method");   //"In Method" is printed to console so
    //Data = data2.clone();              //i know im calling the method correctly
    for(int i = 0; i < 8; i++){
         Data[i] = data2[i];}
}

我已经让它工作了,但只是通过改变方法的签名:

//jni side
mid = env->GetMethodID(cls,"setData","(CCCCCCCC)V");
env->CallVoidMethod(obj,mid,MyClass.Data[0],MyClass.Data[1],MyClass.Data[2],MyClass.Data[3],MyClass.Data[4],
    MyClass.Data[5],MyClass.Data[6],MyClass.Data[7]);

//java side
public void setData(char c1,char c2,char c3,char c4,char c5,char c6,char c7,char c8) {
    Data[0] = c1;
    Data[1] = c2;
    Data[2] = c3;
    Data[3] = c4;
    Data[4] = c5;
    Data[5] = c6;
    Data[6] = c7;
    Data[7] = c8;
}

如何将方法与数组一起使用?在程序的后期,我有更大的数组作为字段,使用一个数组就不会那么困惑。

最佳答案

Java 字符数组与 C 字符数组不同:

  • Java 中的 char 数组是一个包含数组长度和数据的对象
  • Java 中的字符是 16 位,通常是 C 中字符大小的两倍

jni API 具有用于创建 Java 数组和设置其元素的函数:NewCharArray、GetCharArrayElements 和 ReleaseCharArrayElements。

关于java - 从 Java 端访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17861380/

相关文章:

java - 如何使接口(interface)中的返回类型通用?

c++ - 为什么函数不在特定函数之后执行

multithreading - Hadoop Zlib 与 JDK Gzip 性能对比

java - JNI 返回 Java 对象,返回本地引用可以吗,还是必须是全局的?

java - 在 Java 中用一个字符替换多个单个字符?

java - 带线程的进度条 (Java Swing)

java - 如何检查代码中变量的更新/更改位置(java - eclipse)?

c++ - LD_PRELOAD 未按预期工作

c++ - glfwSwapInterval(1) 无法启用 vsync?

android - NDK - 包括错误