【问题标题】:how to pass pointers from java to C in JNI?java - 如何在JNI中将指针从java传递到C?
【发布时间】:2012-04-30 10:00:53
【问题描述】:

我有一个本机方法int sum(int *,int *)。我如何从 java 端传递此方法的参数。

编辑:我成功运行的示例方法是 双 gsl_stats_mean(doubleArray,int,int); 这个方法在 GSL 中可用,因为我已经创建了共享对象,并且从 java 端我已经发送了所需的参数,并且我得到了 double 作为返回值。

【问题讨论】:

  • 取决于此参数必须包含的内容。这个方法期望什么以及它做了什么?
  • 该方法需要两个整数的地址,它会将接收到的参数(不是地址)相加并返回总和。
  • @Malcolm 我的主要目的是知道当本地(C)方法需要指针作为参数时从 java 端传递什么。
  • 所以它不会改变引用的值,对吗?
  • 是的,它没有,但它必须返回总和

标签: java pointers java-native-interface


【解决方案1】:

如果方法不改变引用的值,那么你只需将参数作为值传递,并在本机代码中获取它们的地址:

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 但是您说您使用 JNI,这意味着您将 Java 中的方法定义为本地方法并在本地代码中实现它们。如果不允许你这样做,你打算如何使用 JNI?
  • 所有讨论的内容都是正确的。但是我这篇文章的主要目的是当本地方法需要指针时从 java 端传递什么,以及如何传递。
  • @johnkrishna 当本地函数需要一个指针时,您传递的内容将在本地端转换为指针。我的回答显示了它是如何完成的。如果要将指针从 Java 传递到本机代码,可以通过 long 参数轻松完成。但它的值仍然必须源自本机代码中的某个地方,然后它可能会传递给 Java 并返回。如果你想获得一个指向存储在 Java 中的字段或变量的指针,这显然是不可能的,因为 Java 将程序与直接内存管理隔离开来。
  • 好的,现在我要直截了当地说。我们有一个开源库 GSL,我们没有方法定义,但我们仍然可以为它们创建共享对象,我们可以通过 jni 使用这些函数(从 java 端调用这些方法)。当本机方法需要原始数据类型并且我已经成功使用它们时,一切都很好(请注意,我没有函数定义)。障碍是有方法期望指针作为参数。我如何传递参数以使用它们的功能。感谢您的合作。
【解决方案2】:

看看this discussion它是关于通过JNI在C和Java之间传递指针

【讨论】:

  • 感谢您的回复,但讨论中包含的结构比指针更多。能否请您简要介绍一下如何将指针从 java 单独传递给 c。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多