首页 > 解决方案 > JNI 调用在我的 cpp 共享库中获取 basic_stringstream 声明的符号查找错误

问题描述

场景: CCPJNI.java 对我构建的 CPPJNI.cpp 进行 JNI 调用,包含在 libCCBJNI.so 中,cpp 代码正确执行,直到它到达字符串流声明,然后错误:java:符号查找错误:.../libCCBJNI.so:未定义符号: _ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC1Ev

CCBJNI.cpp . .
out << "写 0 \r\n"; std::ostringstream ss;cout << "写 1 \r\n"; . .

Java 编译:javac -cp ccb.jar:/usr/lib/gcc/x86_64-linux-gnu/7/libgcc._s.so.1:libCCBJNI.so:json-simple-1.1.1.jar:azure-storage -4.2.0.jar CCBTEST.java

javac -cp ccb.jar:LIBCCBJNI.so:json-simple-1.1.1.jar:azure-storage-4.2.0.jar com/shiseido/ccb/CCBJNI.java

Java运行:java -cp .:/usr/lib/gcc/x86_64-linux-gnu/7/libgcc._s.so.1:ccb.jar:libCCBJNI.so:jackson-core-2.12.0-rc1.jar :json-simple-1.1.1.jar:azure-storage-4.2.0.jar CCBTEST

输出: 。. 写 0 java:符号查找错误:/mnt/c/Users/robsc/pahub-linux/pahub_scantech_platform_jniCopy7/Platform_JNI/CCBJNI/gdb2/CCBJNI/Remix/Source/libCCBJNI.so:未定义符号:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC1Ev

注意:除了字符串流之外,还有更多前面的代码和前面的输出可以确认 cpp 代码和标准库工作正常。

我正在使用在 Windows 上运行并为 Linux 构建的 Visual Studio 2019 构建 libCCBJNI.so

问题: 我该如何解决这个问题?stringstream 在单独的 cpp 共享库中吗?如果是这样,lib 名称是什么,我在哪里可以找到它?如何将它包含在我的构建和运行时中?

标签: c++linuxvisual-studiojava-native-interfaceshared-libraries

解决方案


看来是环境问题。在 Windows WSL 上重新安装 Ubuntu 并发出以下问题后: sudo apt update sudo apt install build-essential 它适用于没有未解析的符号


推荐阅读