# convert System::String to jstring



## zu1u (9. Juli 2009)

hallo zusammen,
zunächst mal bin ich nicht sicher ob das thema nicht irgendwo in den .NET Bereich gehört. 
Jedenfalls würde ich gerne im Rahmen von JNI einen System::String in einen jstring konvertieren.. wie der Titel bereits sagt.

Mit der mir bekannten
jstring js= globalEnv->NewStringUTF(string);
komme ich leider nicht weit.

kann mir jemand helfen?


----------



## deepthroat (10. Juli 2009)

Hi.

Probier's mal so:

```
globalEnv->NewStringUTF(string->ToCharArray());
```
Gruß


----------



## zu1u (10. Juli 2009)

danke, funktioniert aber leider nicht 


```
1>.\jni.cpp(71) : error C2664: 'JNIEnv_::NewStringUTF' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'const char *'
1>        with
1>        [
1>            Type=wchar_t,
1>            dimension=1
1>        ]
```


----------



## deepthroat (10. Juli 2009)

Ok.


```
#include <msclr\marshal.h>

using namespace msclr::interop;
...

globalEnv->NewStringUTF(marshal_as<const char*>(string));
```
Gruß


----------



## zu1u (10. Juli 2009)

```
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\msclr\marshal.h(203) : error C4996: 'msclr::interop::error_reporting_helper<_To_Type,_From_Type>::marshal_as': This conversion requires a marshal_context.  Please use a marshal_context for this conversion.
1>        with
1>        [
1>            _To_Type=const char *,
1>            _From_Type=System::String ^
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\msclr\marshal.h(194) : see declaration of 'msclr::interop::error_reporting_helper<_To_Type,_From_Type>::marshal_as'
1>        with
1>        [
1>            _To_Type=const char *,
1>            _From_Type=System::String ^
1>        ]
1>        .\fsw.cpp(75) : see reference to function template instantiation '_To_Type msclr::interop::marshal_as<const char*,System::String^>(const _From_Type &)' being compiled
1>        with
1>        [
1>            _To_Type=const char *,
1>            _From_Type=System::String ^
1>        ]
```

ging das bei dir denn?
und woher nimmst du die Infos? ich müsste nämlich auch die andere Richtung konvertieren :S


----------



## zu1u (10. Juli 2009)

habs jetzt so gemacht.

```
char string[100] = "";
msclr::interop::marshal_context ctx;
const char* deststring1 = ctx.marshal_as<const char*>(str);
strcpy_s(string, deststring1);

jstring jstring_var = globalEnv->NewStringUTF(string);
return jstring_var;
```
jetzt muss ich nur noch einen Rückweg finden

Edit:
hab ich jetzt auch: 

```
const char* charStr = globalEnv->GetStringUTFChars(jstr, NULL);
    String ^text= gcnew String(charStr);
    return text;
```

..danke


----------



## deepthroat (10. Juli 2009)

zu1u hat gesagt.:


> ging das bei dir denn?


Ich hab's nicht ausprobiert, hatte nur schnell geschaut.


zu1u hat gesagt.:


> und woher nimmst du die Infos?


http://msdn.microsoft.com/en-us/library/bb384865.aspx

In die andere Richtung geht einfach mit marshal_as.

Gruß


----------

