JNI новые примитивные типы - PullRequest
5 голосов
/ 23 марта 2010

Как мы можем новые примитивные типы в JNI.У меня есть функция, которая возвращает jobject.Можно вернуть jint, jchar и т. Д.

Есть NewString, почему нет NewInteger, NewCharacter, NewDouble и т. Д. На уровне 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 ]

7 голосов
/ 23 марта 2010

jint, jdouble и т. Д. Не являются jobjects.Как вы говорите, они примитивные переменные.Просто заполните их!

jint someInt = 1;
jdouble someDouble = 3.14159;

Повторное редактирование: я вижу, вы хотите вернуть в штучной упаковке типов, таких как Integer, Double и т. Д.Функция, которую вы опубликовали, - это, вероятно, путь.

1 голос
/ 23 марта 2010

Почему вы чувствуете, что этот подход "слишком много накладных расходов"? Если вы хотите вернуть упакованное значение (это объект, который содержит примитив, а не «тип примитива»), вам нужно создать этот объект.

Одной из альтернатив является вызов метода valueOf() для типа оболочки.

Тем не менее, я думаю, что вам лучше возвращать реальное примитивное значение и позволять ему упаковываться (если вам это нужно), как только оно будет на стороне Java.


Если вы беспокоитесь о накладных расходах для поиска функции / конструктора, то вам следует кэшировать идентификаторы методов. В отличие от указателей объектов, они не изменятся (с некоторыми оговорками перезагруженные классы, которые не применяются к примитивным оберткам). Смотрите пункт 10.7 здесь: http://java.sun.com/docs/books/jni/html/pitfalls.html

...