将参数从 C/C++ JNI 传递到 Java 并获取修改后的值

Posted

技术标签:

【中文标题】将参数从 C/C++ JNI 传递到 Java 并获取修改后的值【英文标题】:Pass parameter from C/C++ JNI to Java and get modified value 【发布时间】:2018-07-11 20:45:58 【问题描述】:

小问题:

将参数从 C++/C JNI 传递给应该修改的 Java 方法。修改后的结果会在 C/C++ JNI 中提供吗?有什么办法吗?除了返回和来自 java 的回调?

如果上面不清楚,请继续:

使用 jcharArray 从 C/C++ JNI 调用以下函数。下面的 Java 函数应该在传递的 char 数组上工作并将最终结果存储在相同的位置。这样修改后的结果将在 C/C++ JNI 中可用。

我的 java 函数接受下面的 char[]

void GetName(char[] s)

    String t = "Test";
    // Work on t and store the result in s
    s = t.toCharArray();

我怎样才能做到这一点...我得到了所有的例子,比如 Java 调用 C/C++。

【问题讨论】:

提示 void GetName(char[] s) s[0] = 'T'; s[1] = 'e'; s[2] = 's'; s[3] = 't'; 工作吗? 我遇到了这个问题。您不能在 C 语言中通过引用传递。 C 语言按值传递,也可以传递指针。在 C++ 中,您可以按值、引用或指针传递。请相应地更新语言标签。另外,请编辑您的帖子,因为没有“C/C++”语言。 这就是 GetName 所做的:为 s 获取一个值,通过为 s 分配一个新值来丢弃它,然后通过返回来丢弃它。它没有效果。一个非常好的编译器/静态分析工具可能会告诉你这些事情。 (一般做法:不要替换参数变量中的值[除了为准备算法而进行的细微调整]。)请参阅答案以获取所需的方法。 【参考方案1】:

Java 仅支持按值传递。如果你想返回一个参考,你需要要么

a) 归还

char[] getName();

b) 传递一个可变对象来引用它

void getName(char[][] nameArray) 
    nameArray[0] = t.toCharArray();

c) 回拨电话

void getName(Consumer<char[]> listener) 
    listener.accept(t.toCharArray());

【讨论】:

【参考方案2】:

所以对于我的场景,我修改了如下声明

void GetName(char[] s) to void GetName(PersonName obj)

所以现在,我在 JNI 中创建 PersonName 对象并将其作为参数传递给 java 函数。后来我使用同一个对象调用 PersonName 类的 getter 方法来获取值 char[] RetriveName();

我还发现使用 jfield 也可以获取类数据成员的值,但这些成员应该是公开的

【讨论】:

以上是关于将参数从 C/C++ JNI 传递到 Java 并获取修改后的值的主要内容,如果未能解决你的问题,请参考以下文章

JNI内两种方式从C/C++中传递一维二维三维数组数据至Java层详细梳理

java 通过jni 向 c 传递一个 java 对象, c 如何取得这个对象的属性值?

JNI内形参从C代码中获取返回值并返回到Java层使用

JNI 回调传递给 C

使用 jni 将位图从 android 相机传递到 C++

Android NDK将参数传递给本机方法