如何处理指向int的指针作为JNI中的参数

时间:2015-12-03 23:50:38

标签: android java-native-interface

好吧我说我有这个C函数

int image(int *w, int *h) {
  *w = 100;
  *h=200;
}

如何在JNI中包装它?我正在为Android平台开发。

jint Java_com_test_image(JNIEnv *env, .....) {
}

3 个答案:

答案 0 :(得分:1)

我想指出你的C代码被声明为返回一个int但没有return语句。

除此之外,你有两个选择IMO:

  • 存储并返回指针值(我的首选方法是在jbyteArray中)并让Java传递它们。您还需要一个JNI函数来实际返回一个jint来取消引用存储的指针(即从''''''')。我认为这不是最佳方式。

  • 使用Java Integer对象并从Java传递它。然后,您的JNI代码可以更新没有问题的值。 Java通过引用传递对象,因此我认为这是最合乎逻辑的概念选择。

正如评论中指出的那样(我在原来的答案中忘记了:-()),Java的Integer类是不可变的(没有变化的值)所以你最简单的方法就是定义一个新类:< / p>

public class mutableInt
{
    int value ;

    public void setValue( int newval )
    {
        this.value = newval ;
    }

    public int getValue()
    {
        return this.value ;
    }
}

因此,使用第二个选项,您的Java边声明就像:

int public native image( mutableInt w, mutableInt h ) ;

在本机端,您将使用JNI函数来更改使用适当方法传递给JNI的w和h对象的值,并以您想要的任何方式计算jint返回值。您使用JNI来使用setValue()和getValue()方法获取和设置参数的值。

答案 1 :(得分:0)

您可能需要考虑将Address和Value返回给Java。

答案 2 :(得分:0)

最好专注于创建自然API ,并在桥接代码中保持任何丑陋。

class Point 
{
    public int x; // consider using accessor methods
    public int y;
}

Point getImagePosition() /* throws SomeException */;

getImagePosition可能是:

  • 使用JNI中的所有桥接代码的native方法,或
  • 它可以部分用Java实现,以使JNI更容易(可能使用@ StevenG&#39; s mutableIntInteger

使用getImagePosition作为native,您将使用JNI调用创建一个Point对象并填充它。 (你也可以给它一个构造函数来填充它。)

在JNI中调用方法的关键是使签名正确。为此,请从.class或.jar文件中提取信息。 (如果需要类,请务必指定类路径。)以下是标准类的示例:

javap -s java.awt.Point | grep -A 2 "Point("

您还必须知道构造函数名为&#34;&lt; init&gt;&#34;。

所以,

constructor = (*env)->GetMethodID(env, cls, "<init>", "()V");