Pregunta

¿Cómo podemos nuevos tipos primitivos en JNI. Tengo una función que devuelve un jobject. Es posible volver jint, jchar, etc.

Hay NewString, por qué no NewInteger, NewCharacter, NewDouble, etc. No hay autoboxing en la capa de JNI en el momento.

Me puede ir con la llamada NewObject, pero esto será demasiado trabajo para crear tipos primitivos.

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);
}

Tengo funciones de contenedor para obtener la clase y el ID de método.

¿Fue útil?

Solución

jint, jdouble, etc., no son jobjects. Como usted dice, son variables primitivas. Sólo tienes que rellenar en!

jint someInt = 1;
jdouble someDouble = 3.14159;

Re edición:. Veo, se desea volver caja tipos como Integer, Double, etc. Sí, la función de contenedor informados es probablemente el camino a seguir

Otros consejos

¿Por qué cree que este enfoque es "demasiado trabajo"? Si desea devolver un valor en caja (que es un objeto que tiene una, no un "tipo primitivo" primitivo), entonces usted necesita para crear ese objeto.

Una alternativa es llamar al método valueOf() del tipo envoltura.

Sin embargo, creo que es mejor devolver el valor primitivo real, y dejar que se vuelva en caja (si es necesario que) una vez que está en el lado de Java.


Si usted está preocupado por la sobrecarga para la consulta de la función / constructor, entonces debería almacenar en caché los identificadores de método. A diferencia de los punteros a objetos, no van a cambiar (con algunas salvedades re clases descargadas que no se aplican a las envolturas primitivos). Véase el punto 10.7 aquí: http://java.sun.com/docs /books/jni/html/pitfalls.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top