我正在使用 JNI 调用 native 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 我像 "c:\test.wav" 一样传递,我只像 c
一样在 c++ 层中打印我正在尝试使用 visual studio 2013 和我选择作为 Unicode 支持的项目字符支持。
我是c++环境的新手,请帮忙找出这个原因。
最佳答案
根据 JNI docs GetStringChars
返回 jchar *
中给定字符串的 unicode 字符,这是一个 unsigned short *
。您将其转换为 char *
。当您将 cout
与 char *
一起使用时,它需要一个带有空终止符的 ASCII 格式的字符串。您将一个指向 unicode 格式字符串的指针传递给它,该字符串的每个其他字符 0
表示纯 ASCII 字符。因此,为什么只打印字符串中的第一个字符。
关于java - 通过 JNI 的数据未正确传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185153/