将参数从 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层详细梳理