Avatar billede gedebuk Nybegynder
28. november 2001 - 19:24 Der er 13 kommentarer og
1 løsning

Konvertere JNI-jstring til C++-char*

Hejsa!

Jeg kalder en C++-metode fra mit Java-program via Java Native Interface (JNI).
I metoden vil jeg gerne arbejde videre på et argument, jeg sendte med, som i Java-programmet er en String.
Hvordan kan jeg konvertere den medsendte jstring til en C++-char* ?

Metoden ser således ud:

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv* env, jobject obj, jstring str)
{
  char* text = ???;
  ...
}
Avatar billede soreno Praktikant
28. november 2001 - 19:28 #1
har du prøvet
char* text = &str;
Avatar billede gedebuk Nybegynder
28. november 2001 - 19:38 #2
Det havde jeg ikke, men det virker desværre ikke. Eller det vil sige, at det giver et resultat, men som tal. Det gør det også, hvis man skriver jstring\'en ud uden at konvertere den først.
Avatar billede soreno Praktikant
28. november 2001 - 19:45 #3
i jni.h står der:
typedef jobject jstring;
altså er jstring et jobject.. hvis det hjælper noget?
Avatar billede nico26 Nybegynder
28. november 2001 - 19:48 #4
const char* c = env->GetStringUTFChars(str, 0);
...
env.ReleaseStringUTFChars(str, c);
Avatar billede nico26 Nybegynder
28. november 2001 - 19:49 #5
env->ReleaseStringUTFChars(str, c);
i stedet for
env.ReleaseStringUTFChars(str, c);
Avatar billede gedebuk Nybegynder
28. november 2001 - 19:51 #6
nico22 > sådan noget havde jeg også tænkt mig. Jeg får dog følgende fejl:
error C2223: left of \'->GetStringUTFChars\' must point to struct/union
Avatar billede nico26 Nybegynder
28. november 2001 - 19:59 #7
??? det forstår jeg ikke jeg - det virker her
Avatar billede gedebuk Nybegynder
28. november 2001 - 20:01 #8
Gør det det? Det er godt nok mystisk. Kan du sende hele metoden så?
Avatar billede nico26 Nybegynder
28. november 2001 - 20:21 #9
JNIEXPORT jdouble JNICALL Java_CppLixBeregning_nativeLix(JNIEnv *env, jobject obj, jstring text) {
  const char *str = env->GetStringUTFChars(text, 0);

  LixParser p(str);
  p.parse();

  env->ReleaseStringUTFChars(text, str);

  jclass cls = env->GetObjectClass(obj);
  jmethodID id = env->GetMethodID(cls, \"setTid\", \"(J)V\");

  if (id != 0) {
    env->CallVoidMethod(obj, id, (jlong)p.getTid());
    return p.getLixTal();
  } else
    return 0;
}
Avatar billede gedebuk Nybegynder
28. november 2001 - 20:28 #10
hmm, jeg kan ikke få det til at virke her, men det er sikkert bare mig. Jeg arbejder videre med det.
Mange tak for hjælpen :-)
Avatar billede nico26 Nybegynder
28. november 2001 - 20:32 #11
prøv:

const char* str = (*env)->GetStringUTFChars(env, text, 0);
Avatar billede gedebuk Nybegynder
28. november 2001 - 21:57 #12
Nu har jeg:
const char* text = (*env)->GetStringUTFChars(env, str, 0);
printf(\"Test: %d\\n\", text);

Der kommer ingen compiler-fejl, men der udskrives stadig kun tal på skærmen. Skulle man da ikke kunne skrive text-variablen ud på denne måde?
Avatar billede nico26 Nybegynder
28. november 2001 - 22:47 #13
const char* text = (*env)->GetStringUTFChars(env, str, 0);
printf(text);

skulle gøre det.
Avatar billede gedebuk Nybegynder
28. november 2001 - 22:48 #14
hehe, min fejl. Der skal selvfølgelig stå %s i stedet for %d i printf()-metoden ovenfor...
Nu virker det hele perfekt.
Endnu engang tak for hjælpen. Det er sgu lækkert, at man får så kvalificeret hjælp så forbandet hurtigt :-)
- gælder naturligvis også soreno
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester