java - 通过 JNI 的数据未正确传递

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

我正在使用 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 *。当您将 coutchar * 一起使用时,它需要一个带有空终止符的 ASCII 格式的字符串。您将一个指向 unicode 格式字符串的指针传递给它,该字符串的每个其他字符 0 表示纯 ASCII 字符。因此,为什么只打印字符串中的第一个字符。

关于java - 通过 JNI 的数据未正确传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185153/

相关文章:

c# - mscoree.dll 的 GetRequestedRuntimeInfo() 导致不正确的 TargetFrameworkDirectories - 如何调试?

c++ - QTreeView - 删除某些元素的可扩展外观

java - 无法使用自定义项目颜色设置服务布局样式

java - 如何将可绘制的 int 数组从一个类传输到另一个类

java - 没有多播的tomcat session 复制

javascript - NoSuchMethod webview 评估javascript

java - 没有可用类型的合格 bean : expected at least 1 bean which qualifies as autowire candidate

c# - 使用 Xamarin Forms 播放视频

android - 在 OpenGL ES 中绘制文本

c++ - 在非静态数据成员上使用 SFINAE?