JNI新的原始类型

时间:2010-03-22 21:06:02

标签: java types java-native-interface primitive autoboxing

我们如何在JNI中使用新的原始类型。我有一个返回jobject的函数。可以返回jintjchar

NewString,为什么不NewIntegerNewCharacterNewDouble等。目前JNI层没有自动装箱。

我可以使用NewObject调用,但创建基本类型的开销太大。

jobject NewInteger(JNIEnv* env, jint value)
{
    jclass cls = FindClass(env, "java/lang/Integer");
    jmethodID methodID = GetMethodID(env, cls, "<init>", "(I)V", false);
    return env->NewObject(cls, methodID, value);
}

我有包装函数来获取Class和MethodID。

2 个答案:

答案 0 :(得分:7)

jintjdouble等不是jobjects。如你所说,它们是原始变量。只需填写它们!

jint someInt = 1;
jdouble someDouble = 3.14159;

重新编辑:我知道,您想要返回盒装类型,例如IntegerDouble等。是的,您发布的包装函数可能是要走的路

答案 1 :(得分:1)

为什么你觉得这种做法“太多开销”?如果要返回一个盒装值(这是一个包含基元的对象,而不是“基本类型”),那么您需要创建该对象。

另一种方法是在包装器类型上调用valueOf()方法。

但是,我认为你最好还是返回实际的原始值,并且一旦它在Java端就让它被盒装(如果你需要的话)。


如果您担心函数/构造函数查找的开销,那么您应该缓存方法ID。与对象指针不同,它们不会改变(有些警告重新卸载不适用于原始包装器的类)。请参见此处的第10.7项:http://java.sun.com/docs/books/jni/html/pitfalls.html