JNI" NewObject"用NULL值初始化时不会返回NULL?

时间:2016-01-18 08:09:23

标签: java android c++ java-native-interface

当我做了一些testing codes时,我得到了一些有效的答案,但我发现了一些其他问题(或者我认为是)。

代码如:

JNIEXPORT jint JNICALL test_jni_Native_testSet(JNIEnv *env, jclass type, jobject tdobj)
{
    //Create Integer class, get constructor and create Integer object
    jclass intClass = env->FindClass(env, "java/lang/Integer");
    jmethodID initInt = env->GetMethodID(env, intClass, "<init>", "(I)V");
    if (NULL == initInt) return -1;
    jobject newIntObj = env->NewObject(env, intClass, initInt, 123);

    //Now set your integer into value atttribute. For this, I would
    //recommend you to have a java setter and call it in the same way 
    //as shown above

    //clean reference
    env->DeleteLocalRef(env, newIntObj); 
    return 0;
}

如果我用行

中的NULL替换123
jobject newIntObj = env->NewObject(env, intClass, initInt, 123);

在java代码中,我通过这个本机函数设置了一个Integer参数。 似乎env-&gt; NewObject如果成功调用构造函数则不会返回NULL。 这意味着我只能使用NULL分配一个jobject而不是调用NewObject函数,并且初始化它将为NULL。

我认为这不是一个好主意。

正如http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html所说:

env->NewObject(...)
RETURNS:

Returns a Java object, or NULL if the object cannot be constructed.

所以,我的问题是:

为什么在用NULL值初始化对象时不返回NULL?

1 个答案:

答案 0 :(得分:1)

函数NewObject使用非类型安全的可变参数列表。如果将 NULL 传递给构造函数,它将被解释为整数值0.因此,它将成功构造一个初始化为0的 Integer 对象。