好吧我说我有这个C函数
int image(int *w, int *h) {
*w = 100;
*h=200;
}
如何在JNI中包装它?我正在为Android平台开发。
jint Java_com_test_image(JNIEnv *env, .....) {
}
答案 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
可能是:
native
方法,或mutableInt
或Integer
)使用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");