如何从 JNI 函数返回变量返回值?



我的JNI方法是:

public native int MD_GetState(int index, int result);

我的 C 函数是:

JNIEXPORT jint JNICALL Java_com_test_MD_1GetState
(JNIEnv *env, jobject obj, jint index, jint result)
{
jint* state, errCode;
jint ret = GetInfo(Index, state, errCode);
if(ret != 0) {
result = errCode;
} else {
result = state;
}
return ret;
}

GetInfo(...)是 DLL 中的一个函数,就此问题而言,它是一个黑盒实现。我想返回stateerrCode的值,具体取决于此函数是返回 0(无错误(还是其他值。

这是正确的方法,还是有更好的方法来实现它?


@user207421 在我的Java代码中,我有以下方法:

public native int methodA(int index, int type, byte[] value);

以及相应的C函数:

JNIEXPORT jint JNICALL Java_com_test_methodA
(JNIEnv *env, jobject obj, jint index, jint type, jbyteArray array)
{
jboolean isCopy;
jsize len = (*env)->GetArrayLength(env, array);
jbyte* bp = (*env)->GetByteArrayElements(env, array, &isCopy);
if (!bp) {
return MDR_INSUFFICIENT_RESOURCES;
}
jint ret = GetValueA(index, type, bp, len);
int mode = 0;
// if error code is returned then do not save changes
if(ret != 0) {
mode = JNI_ABORT;
}
(*env)->ReleaseByteArrayElements(env, array, bp, mode);
return ret;
}

GetValueA(...)bp进行更改,并且我能够以相同的方式将数据返回到我的 Java 代码,所以我想它应该是一个类似的实现吗?


@cdhowie 根据我拥有的文档,stateerrCode的可能值不重叠,因此我认为可以通过这种方式实现它。如果有更好的方法,请告诉我,谢谢!

你在这里几乎没有选择。

  1. 如果出现错误,您可以从JNI代码中抛出异常,并在Exception中添加错误代码

看看这里: http://jnicookbook.owsiak.org/recipe-No-019/

  1. 你可以创建一些'类似'的联合。它不会是一个工会(严格意义上的(,但会服务于类似的目的

爪哇岛

class RetVal {
int index;
int result;
}

然后,您必须在JNI代码中访问此类的字段。

您将能够根据需要更新对象的值并返回(通过对象(值。

请注意,您可以在JNI中更改对象的状态

看看这里: http://jnicookbook.owsiak.org/recipe-No-020/

  1. 你可以使用类型大小hack

您可以返回long而不是int。这样,您可以从两个int值组成long值。

int a = 1;
int b = 1;
long ret = ((long)a) << 32 | ((long)b);
  1. 您可以更改int值数组

看看这里: http://jnicookbook.owsiak.org/recipe-No-013/

  1. 您可以在java.util.Vector内返回值

看看这里: http://jnicookbook.owsiak.org/recipe-no-045/

相关内容

  • 没有找到相关文章

最新更新