c++ - 将字符串传递给 JNI 时访问冲突 ((0xc0000005))

标签 c++ java-native-interface

我有一个简单的 java 类,它通过 JNI 调用一些用 C++ 实现的 native 方法。

java代码是这样的

String in_test="./xml/input/imagen_0023.xml";
//String in_test="avc";
String out_test=acr.testString2(in_test);
System.out.println("test: " + out_test);

testString2的实现在一个dll中,java程序直接调用。 testString2方法的定义如下。

JNIEXPORT jstring JNICALL Java_com_accsa_ocr_AutomaticCharacterRecognition_testString2(JNIEnv *env, jobject obj, jstring string) 
{
    const char *str = env->GetStringUTFChars(string, 0);

    //std::string s=amt_test_string(str);
    std::string s="hello: "+(std::string)str;
    env->ReleaseStringUTFChars(string, str);
    return env->NewStringUTF(s.c_str());
}

调用的 amt_test_string 在别处定义(另一个 dll):

std::string AMT_EXPORT amt_test_string(std::string in)
{
    std::string s="path: "+in;
    std::cout<<s<<std::endl;
    return s;
}

如果我这样运行它,它会很好地工作,但是一旦我取消注释 std::string s=amt_test_string(str) 我收到如下访问冲突错误:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77ae2cc7, pid=8072, tid=7328
#
# JRE version: 7.0_09-b05
# Java VM: Java HotSpot(TM) Client VM (23.5-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [ntdll.dll+0x52cc7]  RtlFreeHeap+0xcd

但是这种行为在某种程度上是不稳定的。如果我减少输入参数的长度,即使用

//String in_test="avc"; 

程序再次运行。根据我在谷歌上学到的知识,它与释放后使用堆栈分配的变量有关,但我真的不知道如何调试它。

编辑 1:我正在使用 Visual Studio 2010 和 Oracle 的 JDK 1.7.09 在 Windows 7 32 位上编译它

编辑 2:AMT_EXPORT 宏只是导出符号的便捷快捷方式。请参阅下面的定义:

#ifdef WIN32
    #ifdef AMT_EXPORTS
        #define AMT_EXPORT __declspec(dllexport)
    #else
        #define AMT_EXPORT __declspec(dllimport)
    #endif
#else
    #define AMT_EXPORT
#endif

最佳答案

我认为你不应该将 const char * 转换为 std::string

std::string s="hello: "+(std::string)str;

通过调用相应的 std::string 构造函数来替换它。

关于c++ - 将字符串传递给 JNI 时访问冲突 ((0xc0000005)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13127723/

相关文章:

c++ - 在从一本书中阅读有关链表的内容时,我陷入了两行

java - JNI - 在 Java 和 native 代码之间传递大量数据

java - 关于在 JNI 中分配的数组

java - 如果调用 JNI DeleteGlobalRef(),相应的 java 对象是否会被垃圾回收?

java - 如何修复将使用 JNI 传输到 Java 的二维数组代码?

c++ - 没有中间表达式的三元运算符

c++ - 将 C++ 从 Oreilly 书籍转换为 Objective-C 的问题(iOS 3D 编程)

c++ - SDL_PollEvent 似乎阻止窗口表面更新

c++ - CRichEditCtrl 在使用 MFC 编写的共享 dll 中无法正常工作?

java - 从 C++ 中诊断与 JNI 一起使用的第三方 jar 中的 SIGBUS