2010-11-15 23 views
98

He pasado una cadena de URL de Java a código C como jstring tipo de datos mediante el uso de JNI. Y mi método de biblioteca necesita un char * como URL.JnI convertir jstring en char *

¿Cómo puedo convertir jstring en char *?

P.S .: ¿Hay alguna ventaja de usar jcharArray en C? (Es decir, pasar char [] en lugar de la cadena en el método nativo)

Respuesta

199

Aquí es aa par de enlace útil que encontré cuando empecé con JNI

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

con respecto a su problema, puede utilizar esta

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

    // use your string 

    (*env)->ReleaseStringUTFChars(env, javaString, nativeString); 
} 
+1

¿es necesario mantener 'nativeString' constante? – Prasham

+4

si marca el segundo enlace, el prototipo de la función GetStringUTFChars es: const jbyte * GetStringUTFChars (JNIEnv * env, cadena jstring, jboolean * isCopy); entonces realmente no tienes una elección –

+1

Gracias, funcionó. Lo acepté como respuesta. Y quería darte +2 votos por eso. Pero parece que cometí un error al hacer doble clic en la flecha hacia arriba. Muchas gracias de todos modos. – Prasham

37

Gracias respuesta de Jason Rogers primero.

En Android & & CPP debe ser la siguiente:

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

// use your string 

env->ReleaseStringUTFChars(javaString, nativeString); 

puede solucionar este error:

1.error: operando base - tipo no tiene puntero ' '>' JNIEnv {aka _JNIEnv} '

2.error: función no coincidente para la llamada a' _JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3.error: ninguna función coincidente para la llamada a '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, & _jstring *, const char * &)'

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

+0

¡Esto realmente me ayudó con el error # 1! – Suzi

+0

Necesita tener (* env) -> en lugar de env-> – AlexanderNajafi