JNI:如何将“unsigned char *”从C ++传递给java

时间:2011-01-17 17:57:54

标签: java c++ c visual-studio-2005 java-native-interface

我有一个'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吗?

感谢任何帮助。

由于

4 个答案:

答案 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);

}