通过JNI的数据传递不正确

时间:2015-01-28 05:19:40

标签: java android c++ c java-native-interface

我正在使用JNI来调用本机C ++层。

java图层

int res= recog(audioFilePath, grammarFilePath, contextID, subContextID);

C ++图层

JNIEXPORT void JNICALL Java_com_uniphore_voice_recogniser_NuanceOfflineRecogniser_recog(JNIEnv *jenv, jobject jobj, jstring jaudioFilePath, 
                           jstring jgrammarFilePath, <br/>
                           jstring jcontextID, 
                           jstring jsubContext)
{

const char* _audioFilePath      = (char*)jenv->GetStringChars(jaudioFilePath, JNI_FALSE);
const char* _grammarFilePath    = (char*)jenv->GetStringChars(jgrammarFilePath, JNI_FALSE);
const char* _contextId          = (char*)jenv->GetStringChars(jcontextID, JNI_FALSE);
const char* _subContextId       = (char*)jenv->GetStringChars(jsubContext, JNI_FALSE);

std::wcout  << "audio file path: "  << _audioFilePath   <<" "<< std::strlen(_audioFilePath) <<std::endl
            << "grammar file path: "<< _grammarFilePath <<" "<<std::strlen(_grammarFilePath) << std::endl
            << "contextId: "        << _contextId       << std::endl
            << "subContextId: "     << _subContextId    << std::endl << std::endl;

我可以看到java层值被正确传递到较低级别但在c ++层中,而在C ++层中打印该值时我可以看到它只打印整个字符串的第一个字符。

假设我传递的audioFilePath像&#34; c:\ test.wav&#34; 我只在 c

我正在尝试使用visual studio 2013和项目角色支持,我选择作为Unicode支持。

我是c ++环境的新手,请帮助解决这个问题。

2 个答案:

答案 0 :(得分:1)

根据JNI docs GetStringChars,返回jchar *unsigned short *中给定字符串的unicode字符。char *。你把它投到cout。当char *0一起使用时,它需要ASCII格式的字符串和空终止符。您传递一个指向unicode格式字符串的指针,该字符串包含纯ASCII字符的所有其他字符{{1}}。因此,为什么你只打印字符串中的第一个字符。

答案 1 :(得分:0)

GetStringChars没有返回指向单字节字符的指针,而是返回两个字节的unicode字符

const jchar * GetStringChars(JNIEnv *env, jstring string,
jboolean *isCopy);

Returns a pointer to the array of Unicode characters of the string.

相反,请尝试

GetStringUTFChars

这也将被终止。