jni正确检查哪些函数返回值?

时间:2015-01-14 14:28:55

标签: java-native-interface

我正确地做了我想要的JNI(至少它有效!))但是在开发时我使用了一堆断言(只是为了确保每一步都没问题)

现在我实际上正在工作,应该检查哪些返回值,哪些可以假设将返回合理的值并且不需要检查

这里是我的一些jni电话

使用的一些支持代码
// given a jni env and NVGpaint this creates a java object
// encapsulating the NVGpaint structure (nvg.Paint)
jobject createPaintJobject(JNIEnv *e, NVGpaint p) 
{
    jclass cls = (*e)->FindClass(e, "nvg$Paint");
    assert(cls != NULL);
    jmethodID constructor = (*e)->GetMethodID(e, cls, "<init>", "()V");
    assert(constructor != NULL);

    jobject nvgpaint = (*e)->NewObject(e, cls, constructor);
    assert(nvgpaint!=NULL);

    jfieldID fid = (*e)->GetFieldID(e, cls,"buff","Ljava/nio/FloatBuffer;");
    assert(fid != NULL);
    jobject jbuff = (*e)->GetObjectField(e, nvgpaint, fid);
    assert(jbuff != NULL);
    NVGpaint* ptr = (void*)(*e)->GetDirectBufferAddress(e, jbuff);
    assert(ptr!=NULL);
    *ptr = p;
    return nvgpaint;
}

更换这些断言的最佳做法是什么,甚至还需要检查?

1 个答案:

答案 0 :(得分:0)

更换这些断言的最佳做法是什么?

与这些断言相比,使用异常检查机制可能会更好。

    env->ExceptionCheck();
    env->ExceptionClear();
    env->ExceptionDescribe();
    env->ExceptionOccurred();

实际上,在调用那些可能引发异常的JNI函数时,你应该总是进行异常检查。