Pergunta

Como podemos criar novos tipos primitivos em JNI.Eu tenho uma função que retorna um jobject.É possível voltar jint, jchar, etc.

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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top