簡體   English   中英

使用Java JNI時轉換字符串類型

[英]Convert String types when using java jni

我嘗試從Java應用程序調用C#代碼,這是通過C ++庫完成的。 所以基本上我最終會遇到03種不同類型的String:

  • jstring(來自Java jni)
  • 字符串^(來自C#)
  • char *(來自C ++)

問題是我必須在其中轉換。 所以我的轉換代碼是:
從C ++到C#

String^ toStringCS(const char *chars){
    int len = (int)strlen(chars);
    array<unsigned char>^ a = gcnew array<unsigned char>(len);
    int i = 0;
    while(i<len){
        a[i] = chars[i];
        i++;
    }
    return Encoding::UTF8->GetString(a);
}

從C#到C ++

char* toStringCPP(String^ P){
   pin_ptr<const wchar_t> wch = PtrToStringChars(P);
   printf_s("%S\n", wch);
   size_t convertedChars = 0;
   size_t  sizeInBytes = ((P->Length + 1) * 2);
   errno_t err = 0;
   char *ch = (char *)malloc(sizeInBytes);
   return ch;
}

從jstring到C ++

jboolean isCopyS1;
const char *c_S1 = env->GetStringUTFChars(s1, &isCopyS1);

但是嘗試執行應用程序時出現錯誤。 當我禁用toStringCS方法時,程序將正常運行。 有人可以告訴我該方法做錯了什么嗎?
我用谷歌搜索從String ^到jstring的轉換,但是我找不到任何解決方案。.你能建議我一些方法嗎?
非常感謝你。

我不確定您要去哪里。 至少您缺少free 但是我不會經過char *而且肯定不會修改 UTF-8(通過GetStringUTFChars)。

Windows上的.NET System :: String和Java System.String都是以代碼單位計數的UTF-16LE編碼Unicode字符序列。

#include <vcclr.h>

jstring CopyDotNetString(JNIEnv *env, System::String^ value)
{
    if (value == nullptr) return 0;

    const auto codeunitCount = value->Length;
    /* .NET System::Char, C++ std::wchar_t, JNI jchar, and Java char are 
        all the same size and hold a UTF-16LE code unit. */
    const pin_ptr<const wchar_t> buffer = PtrToStringChars(value); 
    return env->NewString(
        reinterpret_cast<const jchar*>(buffer),
        codeunitCount);
}

System::String^ GetStringFromJava(JNIEnv *env, jstring value)
{
    if (value == 0) return nullptr;

    const auto codeunitCount = env->GetStringLength(value);
    const auto buffer = env->GetStringChars(value, NULL);
    try {
        return gcnew System::String(
           reinterpret_cast<const wchar_t*>(buffer), 
           0, 
           codeunitCount);
    }
    finally {
        env->ReleaseStringChars(value, buffer);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM