我的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 中的一个函数,就此问题而言,它是一个黑盒实现。我想返回state
或errCode
的值,具体取决于此函数是返回 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 根据我拥有的文档,state
和errCode
的可能值不重叠,因此我认为可以通过这种方式实现它。如果有更好的方法,请告诉我,谢谢!
你在这里几乎没有选择。
- 如果出现错误,您可以从
JNI
代码中抛出异常,并在Exception
中添加错误代码
看看这里: http://jnicookbook.owsiak.org/recipe-No-019/
- 你可以创建一些'类似'的联合。它不会是一个工会(严格意义上的(,但会服务于类似的目的
爪哇岛
class RetVal {
int index;
int result;
}
然后,您必须在JNI
代码中访问此类的字段。
您将能够根据需要更新对象的值并返回(通过对象(值。
请注意,您可以在JNI
中更改对象的状态
看看这里: http://jnicookbook.owsiak.org/recipe-No-020/
- 你可以使用类型大小hack
您可以返回long
而不是int
。这样,您可以从两个int
值组成long
值。
int a = 1;
int b = 1;
long ret = ((long)a) << 32 | ((long)b);
- 您可以更改
int
值数组
看看这里: http://jnicookbook.owsiak.org/recipe-No-013/
- 您可以在
java.util.Vector
内返回值
看看这里: http://jnicookbook.owsiak.org/recipe-no-045/