当我使用公共本机void函数时,如何更改活动中的int值

时间:2015-08-21 03:11:50

标签: android java-native-interface

我是新手,并使用Eclipse开发Android应用。 我有一个使用JNI的android项目。

但我有一个问题,我现在无法解决。 当我使用public native void function时如何更改活动中的int值?

我的代码如下,

ImageActivity.java

int width = 100, height = 0;

public native void FindFeatures(long matRgba1, long matRgba2, long matRgba3, int width, int height);

FindFeatures(M1.getNativeObjAddr(), M2.getNativeObjAddr(), M3.getNativeObjAddr(), width, height);

String ch = ""+ width;
t.setText(ch);

jin_part.cpp

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_ImageActivity_FindFeatures(JNIEnv*, jobject, jlong Rgba1, jlong Rgba2, jlong Rgba3, jint width, jint height);

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_ImageActivity_FindFeatures(JNIEnv*, jobject, jlong Rgba1, jlong Rgba2, jlong Rgba3, jint width, jint height)
{
  width = 20;
}
}

我想更改JNI中的with值,并将其显示在活动文本中。

运行代码后,文本结果仍然是100作为初始值,而不是20。

我搜索了许多文章并试过,但失败了。

如果有人可以提供帮助,我将非常感谢您的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:3)

值不会发生变化,因为JNI代码中的width变量是按值传递的,而不是通过引用传递的。 (在这种情况下,如果您使用Java实现而不是本机实现,那将是相同的,因为该变量是基本类型。)您不能直接执行您想要的操作。

可能的解决方法:

  1. 使方法返回值而不是void。
  2. 创建一个简单的类,它保存您想要作为成员变量来回传递的整数值。
  3. 对于它的价值,我认为方法有"副作用"像这样通常被认为是糟糕的形式,特别是在Java社区。也许还有另一种方法可以得到你想要的东西吗?