Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » convert jstring to LPCOLESTR

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.06.2007, 07:39 Uhr
~Life76
Gast


Hallo zusammen,

ich bin ein absoluter Neuling und habe meine Mühe und Not mit der Verarbeitung von Strings in C++.

Ich habe folgendes Problem:

Ich erhalte über das JNI einen jstring. Dieser beinhaltet den Pfad einer Datei, die ich erstellen möchte. Die Funktion "SetOutputFileName" benötigt allerdings, wenn ich das richtig verstehe, einen String vom Typ LPCOLESTR. Ich habe leider keine Ahnung, wie ich die Konvertierung vollziehen muss. Kann mir aber nicht vorstellen, dass das so schwer ist.

Ich hoffe ich konnte mich verständlich machen können und freue mich über jede Hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.06.2007, 17:43 Uhr
~Life76
Gast


Hab mir gedacht, dass es vielleicht besser ist, wenn ich den Code dazu schreibe...:-)

Also, die Nativ-Funktion, die via Java aufgerufen wird lautet:

C++:
JNIEXPORT void JNICALL Java_cmToolkit_cmEasyVideoRecorderJNI_startMovie(JNIEnv *env, jclass clazz, jstring jpath )
{
  return;
}



Nun habe ich vor, mit "jpath"(welches den Pfad der Datei beinhaltet) die C-Funktion "SetOutputFileName" auszuführen. Ich habe es einfach so mal versucht:


C++:
JNIEXPORT void JNICALL Java_cmToolkit_cmEasyVideoRecorderJNI_startMovie(JNIEnv *env, jclass clazz, jstring jpath )
{
  char cpath = (char) jpath;
  LPCOLESTR lcpath = (LPCOLESTR)cpath;
  m_pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi,lcpath,&pMux, &pSink);
  return;
}



Aber das funktioniert leider nicht. Mit folgendem Code läufts:

C++:
JNIEXPORT void JNICALL Java_cmToolkit_cmEasyVideoRecorderJNI_startMovie(JNIEnv *env, jclass clazz, jstring jpath )
{
  m_pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi,L"C:\\Beispiel.avi",&pMux, &pSink);
  return;
}


Aber das bringt mir nichts, weil ich den Pfad eben über ne Variable steuern will.

Danke schon mal, für die Hilfe.

Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt, Einrückung. Nächstes mal selbst machen.


Dieser Post wurde am 19.06.2007 um 17:45 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.06.2007, 17:43 Uhr
0xdeadbeef
Gott
(Operator)


LPCOLESTR gibts im Standard-C++ nicht, wenn mich aber grad nicht alles täuscht, bezeichnet das Zeichenketten mit 2 Byte Zeichenbreite. Bequemerweise verwaltet Java den Kram intern genauso, also:

C++:
LPCOLESTR str = env->GetStringChars(dein_java_string, NULL);

SetOutputfileName(str);

env->ReleaseStringChars(dein_java_string, str);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.06.2007, 17:54 Uhr
~Life76
Gast


Hab ich direkt ausprobiert:-)...


C++:
JNIEXPORT void JNICALL Java_cmToolkit_cmEasyVideoRecorderJNI_startMovie(JNIEnv *env, jclass clazz, jstring jpath )
{


  LPCOLESTR str = env->GetStringChars(jpath, NULL);
  m_pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi,str,&pMux, &pSink);
  return;
}



...bekomm dan aber leider nur die Meldung:


Code:
error C2440: 'Initialisierung': 'const jchar *' kann nicht in 'LPCOLESTR' konvertiert werden
1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
error C2664: 'JNIEnv_::ReleaseStringChars': Konvertierung des Parameters 2 von 'LPCOLESTR' in 'const jchar *' nicht möglich
1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.



Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt. Strike 2. Beim nächsten Mal fang ich an, Posts zu löschen.


Dieser Post wurde am 19.06.2007 um 18:43 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.06.2007, 18:45 Uhr
0xdeadbeef
Gott
(Operator)


Wenn das Ding ne explizite Konversion benötigt, dann gib ihm halt eine.

C++:
  jchar const *str = env->GetStringChars(jpath, NULL);

  m_pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi, reinterpret_cast<LPCOLESTR>(str), &pMux, &pSink);

  env->ReleaseStringChars(jpath, str); // Das hier auf keinen Fall vergessen! Sonst gibts Speicherlecks.

  return;


Wenns damit auch nicht hinhaut, haben diese LPCOLESTR-Dinger im Zweifel noch irgendwas besonderes an sich, das solltest du aber besser im WinAPI-Forum erfragen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.06.2007 um 18:46 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.06.2007, 19:07 Uhr
~Life76
Gast


Hey!! Vielen Dank. Es funktioniert! Warst mir eine grosse Hilfe.

Irgendwie hab ich noch Probleme von Java auf C++ umzudenken.

Nochmals Danke. Echt klasse.

Wofür ist denn die Funktion "ReleaseStringChars"? Wird dadurch der Speicher wieder freigegeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.06.2007, 19:14 Uhr
0xdeadbeef
Gott
(Operator)


Das erniedrigt den Semaphor für das String-Objekt, damit der Garbage Collector das nachher auch aufräumen kann. Das kann er nicht, solange er glaubt, dass die native Bibliothek sich den Buffer noch vorhielte.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.06.2007, 19:24 Uhr
~Life76
Gast


alles klar :-).

nochmals danke...und schönen abend noch...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: