JNI convertendo jstring em char *

113

Passei uma string de URL de Java para código C como jstringtipo de dados por meio do uso de JNI. E meu método de biblioteca precisa de um char *url como.

Como posso converter jstringem char *?

PS: Existe alguma vantagem em usar jcharArray em C? (ou seja, passagem em char []vez de string no método nativo)

Prasham
fonte
Você já pensou em consultar a documentação?
Marquês de Lorne de

Respostas:

227

Aqui está um par de links úteis que encontrei quando comecei com JNI

http://en.wikipedia.org/wiki/Java_Native_Interface
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

em relação ao seu problema, você pode usar isso

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)   
{
   const char *nativeString = env->GetStringUTFChars(javaString, 0);

   // use your string

   env->ReleaseStringUTFChars(javaString, nativeString);
}
Jason Rogers
fonte
1
é necessário manter nativeStringconstante?
Prasham
5
se você verificar o segundo link, o protótipo da função GetStringUTFChars é: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); então você realmente não tem escolha
Jason Rogers
1
Acho que vale a pena notar que a técnica descrita aqui (e na página da Wikipedia) usa codificação UTF-8 modificada, que pode não funcionar em todas as situações. Consulte developer.android.com/guide/practices/…
cqcallaw
1
Obrigado, esse trabalho, mas curiosamente const char * não pode ser convertido em char * :).
CoDe
1
@CoDe Tecnicamente, poderia com um pouco de mágica, mas é melhor evitar isso; provavelmente é declarado constpor um motivo. A resposta correta para o seu problema é strcpyde const char*para a char*. Isso deve fornecer a você o mutável char*que você deseja.
Loduwijk de
51

Obrigado pela resposta de Jason Rogers primeiro.

No Android && cpp deve ser este:

const char *nativeString = env->GetStringUTFChars(javaString, nullptr);

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Pode corrigir esses erros:

1.erro: operando base de '->' tem tipo não-ponteiro 'JNIEnv {também conhecido como _JNIEnv}'

2.erro: nenhuma função correspondente para chamada para '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3.erro: nenhuma função correspondente para chamada para '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4.add "env-> DeleteLocalRef (nativeString);" no final.

kangear
fonte
Você precisa ter (* env) -> em vez de env->
AlexanderNajafi
2
Você só precisa (*env)->se estiver usando C, não C ++.
sixones