Novos tipos primitivos JNI
-
21-09-2019 - |
Pergunta
Como podemos criar novos tipos primitivos em JNI.Eu tenho uma função que retorna um jobject
.É possível voltar jint
, jchar
, etc.
Há NewString
, por que não NewInteger
, NewCharacter
, NewDouble
, etc.Não há autoboxing na camada JNI no momento.
Eu posso ir com o NewObject
chamada, mas isso será muito trabalhoso para criar 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);
}
Eu tenho funções wrapper para obter Class e MethodID.
Solução
jint
, jdouble
, etc.não são jobjects
.Como você disse, são variáveis primitivas.Basta preenchê-los!
jint someInt = 1;
jdouble someDouble = 3.14159;
Reeditar:Entendo, você quer voltar encaixotado tipos como Integer
, Double
, etc.Sim, a função wrapper que você postou é provavelmente o caminho a percorrer.
Outras dicas
Por que você acha que essa abordagem é "muito sobrecarga"? Se você deseja retornar um valor em caixa (que é um objeto que contém um primitivo, não um "tipo primitivo"), você precisa criar esse objeto.
Uma alternativa é ligar para o valueOf()
Método no tipo de invólucro.
No entanto, acho que é melhor retornar o valor primitivo real e deixá -lo ser encaixotado (se precisar disso) quando estiver no lado Java.
Se você está preocupado com a sobrecarga para a pesquisa de função/construtor, cache os IDs do método. Ao contrário dos ponteiros de objetos, eles não mudarão (com algumas advertências re -classes descarregadas que não se aplicam a invólucros primitivos). Veja o item 10.7 aqui: http://java.sun.com/docs/books/jni/html/pitfalls.html