JNI che converte jstring in char *


113

Ho passato una stringa URL da Java al codice C come jstringtipo di dati tramite l'uso di JNI. E il mio metodo di libreria ha bisogno di un char *URL.

Come posso convertire jstringin char *?

PS: c'è qualche vantaggio nell'usare jcharArray in C? (ovvero passaggio char []invece di stringa nel metodo nativo)


Hai considerato la consultazione della documentazione?
Marchese di Lorne

Risposte:


227

Ecco un paio di link utili che ho trovato quando ho iniziato con JNI

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

riguardo al tuo problema puoi usare questo

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

1
è necessario mantenersi nativeStringcostanti?
Prasham

5
se controlli il secondo collegamento, il prototipo della funzione GetStringUTFChars è: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); quindi non hai davvero scelta
Jason Rogers

1
Penso che valga la pena notare che la tecnica qui delineata (e sulla pagina di Wikipedia) utilizza la codifica UTF-8 modificata, che potrebbe non funzionare in tutte le situazioni. Vedi developer.android.com/guide/practices/…
cqcallaw

1
Grazie, funziona, ma è interessante notare che const char * non può essere convertito in char * :).
CoDe

1
@CoDe Tecnicamente, potrebbe con un po 'di magia, ma è meglio evitarlo; probabilmente è dichiarato constper un motivo. La risposta corretta al tuo problema è strcpyda const char*in a char*. Questo dovrebbe fornirti il ​​mutevole char*che desideri.
Loduwijk

51

Grazie prima della risposta di Jason Rogers.

In Android && cpp dovrebbe essere questo:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Può correggere questi errori:

1.errore: l'operando di base di '->' ha un tipo non puntatore 'JNIEnv {aka _JNIEnv}'

2.errore: nessuna funzione corrispondente per la chiamata a "_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)"

3.errore: nessuna funzione corrispondente per la chiamata a '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4.add "env-> DeleteLocalRef (nativeString);" alla fine.


Devi avere (* env) -> invece di env->
AlexanderNajafi

2
Hai solo bisogno (*env)->se stai usando C, non C ++.
sixones
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.