我正在使用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 ++环境的新手,请帮助解决这个问题。
答案 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
这也将被终止。