Вопрос

Как мы можем новые примитивные типы в 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);
}

У меня есть функции обертки, чтобы получить класс и MethodId.

Это было полезно?

Решение

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

jint someInt = 1;
jdouble someDouble = 3.14159;

Re Edit: Понятно, вы хотите вернуться в штучной упаковке типы как Integer, Double, и т. д. Да, функция обертки, которую вы опубликовали, вероятно, направлен на то, чтобы пойти.

Другие советы

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

Одна альтернатива - назвать valueOf() Метод на типе обертки.

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top