如何在JNI中从Java传递指针到C语言?

3
我有一个本机方法int sum(int *,int *)。我如何从Java端传递参数给这个方法。
编辑: 我已成功运行的示例方法是 double gsl_stats_mean(doubleArray,int,int); 此方法在GSL中可用,因此我创建了共享对象,并从Java端发送所需的参数,然后获得了double作为返回值。

这取决于这些参数需要包含什么。这个方法期望什么,它又做了什么? - Malcolm
该方法期望接收两个整数的地址,并对接收到的参数(而非地址)进行加法运算,然后返回它们的和。 - johnkrishna
@Malcolm,我的主要意图是了解在本地(C)方法期望指针作为参数时,从Java端传递什么。 - johnkrishna
那么它不会改变引用的值,我是正确的吗? - Malcolm
是的,它目前不会返回总和,但必须返回。 - johnkrishna
3个回答

6
如果该方法不改变所引用的值,那么只需将参数作为值传递,并在本地代码中获取它们的地址:
JNIEXPORT jint JNICALL Java_com_example_Summator_sum(JNIEnv *env, jobject thisObj,
        jint firstAddend, jint secondAddend) {
     return (jint) sum(&firstAddend, &secondAddend);
}

而在Java中,方法是:

native int sum(int firstAdded, int secondAddend);

显然,除了在sum函数中,你不需要指针,所以在Java中没有必要使用它们。


是的,你完全正确。但问题是方法的定义不在我这里,我只有使用它的权限。所以我需要一种在Java端传递指针的方法论。 - johnkrishna
@johnkrishna 但是你说你使用JNI,这意味着你在Java中定义本地方法并在本地代码中实现它们。如果你不被允许这样做,那么你打算如何使用JNI呢? - Malcolm
所有讨论的内容都是正确的。但我发帖的主要目的是讨论在Java端传递指针给本地方法时应该如何操作。 - johnkrishna
@johnkrishna 当本地函数需要指针时,您传递的是在本地端将被转换为指针的内容。我的答案展示了如何完成这个过程。如果您想要从Java传递指针到本地代码,可以通过长参数轻松实现。但它的值仍然必须在本地代码中产生,然后才能传递到Java并返回。如果您想要获取存储在Java中的字段或变量的指针,显然这是不可能的,因为Java隔离了程序与直接内存管理之间的联系。 - Malcolm
@johnkrishna 我目前看到你自己没有写过任何C代码。但是你能否展示一下调用它的Java代码呢? - Malcolm
显示剩余3条评论

2

请看这个讨论,它涉及通过JNI在C和Java之间传递指针。


谢谢您的回复,但讨论涉及到更多的结构而不是指针。您能否请简要说明如何仅从Java传递指针到C? - johnkrishna

0

除非你必须使用JNI,否则JNA可能是更好的选择。我发现它更容易使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接