我有一个'unsigned char *',我希望使用JNI将它传递给Java代码 我已经按照以下方式尝试了它
jstring test1;
std::string str(reinterpret_cast<const char*>(ucptest));
test1 = env->NewStringUTF(str.c_str());
其中'ucptest'是'unsigned char *'并且其中包含ascii值。 这段代码有效,我可以成功地将jstring传递给Java代码,但是在加载调用中我看到JVM崩溃了。
崩溃的可能原因是什么?崩溃是不一致的,这可能意味着内存损坏。
有人可以建议一种更好的方法将'unsigned char *'传递给Java吗?
感谢任何帮助。
由于
答案 0 :(得分:3)
我找到了解决方案,并且认为我会分享相同的内容,以便其他人可以使用它。
最初我将char*
转换为C ++ String,然后将其传递给Java String
。这工作得很好,直到我试图转换的字符串中有“0”。这导致了崩溃。
最后,我使用字节数组将值传递给服务器。这很完美。
jbyteArray jbArray = env->NewByteArray((int)call.len);
env->SetByteArrayRegion(jbArray, 0, (int)call.len, (jbyte*)call.data);
答案 1 :(得分:0)
我不明白为什么你加入额外的投射步骤,java字符串是unicode,unsigned char *
或wchar_t *
或std::wstring().c_str()
可以更直接地使用。
unsigned char * ucptest=L"somestring";
jstring test1;
std::string str(reinterpret_cast<const char*>(ucptest));
test1 = env->NewStringUTF(str.c_str());
jstring test2 = env->NewString(ucptest,wcslen(ucptest));
答案 2 :(得分:0)
您正在使用的std::string
constructor需要一个空终止的c-string。构造函数将读取,直到找到一个空字符,这可能导致崩溃。如果您的字符串不是nul终止(std::string(char*,size_t)
),则应使用不同的构造函数。
答案 3 :(得分:0)
在您的情况下,行env->NewStringUTF(str.c_str());
必须位于条件块内以便检查getStaticMethodInfo
:
代码可以框架为:
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t,<ANDROID CLASS PATH>,<METHOD NAME>,<PARAM TYPE>)) {
jstring jstr = t.env->NewStringUTF(<CONST CHAR* TYPE DATA>);
...........CALL TO JAVA METHOD THROUGH JNI
t.env->DeleteLocalRef(t.classID);
}