Java 分配字符串时出现异常\u访问\u冲突

Java 分配字符串时出现异常\u访问\u冲突,java,c++,java-native-interface,Java,C++,Java Native Interface,我试图通过JNI将java通过的字符串分配给C++类实例的字段,但总是会得到错误,而错误似乎来自于任何地方。我的应用程序在本机代码中崩溃,本机代码只执行辅助操作 发生崩溃的JNI方法 [SCVXManager.java] public static native void configure(String server, String realm, String username, String accountHandle); [SCVXManager.cpp] JNIEXPORT voi

我试图通过JNI将java通过的字符串分配给C++类实例的字段,但总是会得到错误,而错误似乎来自于任何地方。我的应用程序在本机代码中崩溃,本机代码只执行辅助操作

发生崩溃的JNI方法

[SCVXManager.java]

public static native void configure(String server, String realm, String username, String accountHandle);

[SCVXManager.cpp]

JNIEXPORT void JNICALL Java_mods_voicechat_SCVXManager_configure(JNIEnv * jenv, jclass jcl, jstring server,
                                                                 jstring realm, jstring username, jstring accountHandle) {

    auto app = SCVXApp::getApp();

    auto serverStr = jenv->GetStringUTFChars(server, NULL);
    auto realmStr = jenv->GetStringUTFChars(realm, NULL);
    auto usernameStr = jenv->GetStringUTFChars(username, NULL);
    auto accountHandleStr = jenv->GetStringUTFChars(accountHandle, NULL);

    app->configure(serverStr, realmStr, usernameStr, accountHandleStr);

    jenv->ReleaseStringUTFChars(server, serverStr);
    jenv->ReleaseStringUTFChars(realm, realmStr);
    jenv->ReleaseStringUTFChars(username, usernameStr);
    jenv->ReleaseStringUTFChars(accountHandle, accountHandleStr);
}
发生崩溃的本机方法和相关变量的定义

[SCVXApp.cpp]

void SCVXApp::configure(const string &server, const string &realm, const string &username, const string &accountHandle) {
    m_server = server;
    m_realm = realm;
    m_username = username;
    m_accountHandle = accountHandle;
}

[SCVXApp.h]

class SCVXApp {

private:
    string m_realm;
    string m_server;
    string m_accountHandle;
    string m_username;

    <...>
}
[SCVXApp.cpp]
void SCVXApp::configure(常量字符串和服务器、常量字符串和领域、常量字符串和用户名、常量字符串和帐户句柄){
m_server=服务器;
m_realm=领域;
m_username=用户名;
m_accountHandle=accountHandle;
}
[SCVXApp.h]
类SCVXApp{
私人:
字符串m_域;
字符串m_服务器;
字符串m_accountHandle;
字符串m_用户名;
}
崩溃堆栈跟踪

Current thread (0x00000000050d5800):  JavaThread "Main thread" [_thread_in_native, id=22916, stack(0x0000000004ed0000,0x0000000004fd0000)]

siginfo: ExceptionCode=0xc0000005, writing address 0x00007ffbf2a6cb64

Registers:
RAX=0x00000000cccccccc, RBX=0x000000003e7e69d8, RCX=0x00007ffbf2a6cb64, RDX=0x000000002614e2e0
RSP=0x0000000004fcce58, RBP=0x0000000004fcd0f0, RSI=0x00000000c1720228, RDI=0x0000000004fcce80
R8 =0x0000000000000020, R9 =0x0000000004fccfd0, R10=0x000000002614e2e0, R11=0x00007ffbf2a6cb64
R12=0x0000000000000000, R13=0x000000003e7e69d8, R14=0x0000000004fcd128, R15=0x00000000050d5800
RIP=0x00007ffbf2a316e9, EFLAGS=0x0000000000010246

Top of Stack: (sp=0x0000000004fcce58)
0x0000000004fcce58:   00007ffbf2a6594c cccccccccccccccc
0x0000000004fcce68:   cccccccccccccccc cccccccccccccccc
0x0000000004fcce78:   cccccccccccccccc 0000000004fcced0
0x0000000004fcce88:   00007ffbf2a65578 00007ffbf2a6cb64
0x0000000004fcce98:   000000002614e2e0 0000000000000020
0x0000000004fccea8:   cccccccccccccccc 0000000004fccf40
0x0000000004fcceb8:   00007ffbf2a6cb64 cccccccccccccccc
0x0000000004fccec8:   cccccccccccccccc 0000000004fccf10
0x0000000004fcced8:   00007ffbf2a697da 0000000004fccf40
0x0000000004fccee8:   000000002614e2e0 0000000000000020
0x0000000004fccef8:   cccccccccccccccc 0000000004fcd020
0x0000000004fccf08:   cccccccccccccccc 0000000004fccf40
0x0000000004fccf18:   00007ffbf2a67905 0000000004fccf40
0x0000000004fccf28:   0000000004fcd020 cccccccccccccccc
0x0000000004fccf38:   cccccccccccccccc 0000000004fcd060
0x0000000004fccf48:   00007ffbf2a6cb64 0000000004fccec0 

Instructions: (pc=0x00007ffbf2a316e9)
0x00007ffbf2a316c9:   8b df 48 8b f9 49 8b c8 4c 8b c6 49 8b f2 f3 a4
0x00007ffbf2a316d9:   49 8b f0 49 8b fb c3 0f 10 02 41 0f 10 4c 10 f0
0x00007ffbf2a316e9:   0f 11 01 41 0f 11 4c 08 f0 48 8b c1 c3 66 66 0f
0x00007ffbf2a316f9:   1f 84 00 00 00 00 00 48 8b c1 4c 8d 0d f6 e8 ff 


Register to memory mapping:

RAX=
[error occurred during error reporting (printing register info), id 0xc0000005]

Stack: [0x0000000004ed0000,0x0000000004fd0000],  sp=0x0000000004fcce58,  free space=1011k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [VCRUNTIME140D.dll+0x16e9]
C  [vivox_test.dll+0x594c]  std::char_traits<char>::move+0x3c
C  [vivox_test.dll+0x5578]  std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign+0x78
C  [vivox_test.dll+0x97da]  std::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator=+0x8a
C  [vivox_test.dll+0x7905]  SCVXApp::configure+0x45
C  [vivox_test.dll+0xcb64]  Java_net_core_processing_SCVXManager_configure+0x134
C  0x00000000051f09cc

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  net.core.processing.SCVXManager.configure(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V+0
j  net.core.processing.SCVXController.load(Lnet/common/event/InitializationEvent;)V+39
v  ~StubRoutines::call_stub
<...>
当前线程(0x00000000050d5800):JavaThread“Main thread”[\u-thread\u-in\u-native,id=22916,堆栈(0x0000000004ed0000,0x0000000004fd0000)]
siginfo:ExceptionCode=0xc0000005,写入地址0x00007ffbf2a6cb64
登记册:
RAX=0x00000000CCCC,RBX=0x000000003e7e69d8,RCX=0x00007ffbf2a6cb64,RDX=0x000000002614e2e0
RSP=0x0000000004fcce58,RBP=0x0000000004fcd0f0,RSI=0x00000000c1720228,RDI=0x0000000004fcce80
R8=0x0000000000000020,R9=0x0000000004fccfd0,R10=0x000000002614e2e0,R11=0x00007ffbf2a6cb64
R12=0x0000000000000000,R13=0x000000003e7e69d8,R14=0x0000000004fcd128,R15=0x00000000050d5800
RIP=0x00007ffbf2a316e9,EFLAGS=0x000000000010246
堆栈顶部:(sp=0x0000000004fcce58)
0x0000000004fcce58:00007ffbf2a6594c CCCC
0x0000000004fcce68:CCCC
0x0000000004fcce78:CCCC 0000000004fcced0
0x0000000004fcce88:00007ffbf2a65578 00007ffbf2a6cb64
0x0000000004fcce98:00000000 2614E2E0 00000000000000 20
0x0000000004fccea8:CCCC 0000000004fccf40
0x0000000004fcceb8:00007ffbf2a6cb64 CCCCCC
0x0000000004fccec8:CCCC 0000000004fccf10
0x0000000004fcced8:00007ffbf2a697da 000000000 4FCCF40
0x0000000004fccee8:00000000 2614E2E0 00000000000000 20
0x0000000004fccef8:CCCC 0000000004fcd020
0x0000000004fccf08:CCCC 0000000004fccf40
0x0000000004fccf18:00007ffbf2a67905 000000000 4FCCF40
0x0000000004fccf28:000000000 4FCD020 CCCC
0x0000000004fccf38:CCCC 000000000 4FCD060
0x0000000004fccf48:00007ffbf2a6cb64 000000000 4FCCEC0
说明:(pc=0x00007ffbf2a316e9)
0x00007ffbf2a316c9:8b df 48 8b f9 49 8b c8 4c 8b c6 49 8b f2 f3 a4
0x00007ffbf2a316d9:49 8b f0 49 8b fb c3 0f 10 02 41 0f 10 4c 10 f0
0x00007ffbf2a316e9:0f 11 01 41 0f 11 4c 08 f0 48 8b c1 c3 66 0f
0x00007ffbf2a316f9:1f 84 00 00 48 8b c1 4c 8d 0d f6 e8 ff
寄存器到内存映射:
雷克斯=
[错误报告期间出错(打印寄存器信息),id 0xc0000005]
堆栈:[0x0000000004ed0000,0x0000000004fd0000],sp=0x0000000004fcce58,可用空间=1011k
本机框架:(J=编译的Java代码,J=解释的,Vv=虚拟机代码,C=本机代码)
C[VCRUNTIME140D.dll+0x16e9]
C[vivox_test.dll+0x594c]std::char_traits::move+0x3c
C[vivox_test.dll+0x5578]std::basic_string::assign+0x78
C[vivox_test.dll+0x97da]std::basic_string::operator=+0x8a
C[vivox_test.dll+0x7905]SCVXApp::configure+0x45
C[vivox_test.dll+0xcb64]Java_网络_核心_处理_SCVXManager_配置+0x134
C 0x00000000051f09cc
Java框架:(J=编译的Java代码,J=解释的,Vv=虚拟机代码)
jnet.core.processing.SCVXManager.configure(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V+0
j net.core.processing.SCVXController.load(Lnet/common/event/InitializationEvent;)V+39
v~StubRoutines::调用_stub
可能需要注意的是,
configure
函数中分配的字段在此之前都没有引用过

如果这很重要的话,
vivox_test.dll
是使用CMake用MSBuild构建的共享库吗


我不明白是什么导致了这个问题,我该如何解决这个问题。

不要使用移动语义。(从4个参数中删除“&”),只留下“C++”函数中的“字符串”。使用副本。可能是从jenv返回的字符串导致了与移动相关的问题。此外,请检查(调试)从jenv返回的字符串。

“它只执行赋值”--因此显示
m_服务器
m_领域
,等等的声明。@JimGarrison更新了问题并添加了一段头文件。嗯,您是否确定指令指针
0x00007ffbf2a316e9
位于
SCVXApp::configure
中?
SCVXApp::getApp()
是否返回了无效指针?在这里发布之前,请自己进行更多的调试,如果您已经完成了所有这些,请在问题中明确说明。您的问题中确实没有足够的信息供任何人在这里帮助您。std::char_traits::move+0x3c move异常。编译器可能已决定使用move,但这不是问题所在,GetStringUTFChars返回一个原始字符指针,因此在调用Configure时,要从中移动的字符串必须是临时创建的。但崩溃正在发生。若它是副本,那个么我们肯定知道问题在于初始数据。所以我写了另一个关于调试的声明(至少是日志记录)。也许他的应用程序也是空的。但是如果你删除了引用,编译器就更有可能生成一个move,因为它肯定不会再使用临时程序了。更有可能的是应用程序为空/无效/corrupted@AlanBirtles是的,你说得对。指向应用程序的指针不知何故已损坏。修复了它,现在它似乎工作了。谢谢你的提示!