Java JNI "symbol lookup error" with c++ 库
Java JNI "symbol lookup error" with c++ library
我正在树莓派上构建一个小应用程序。我有一个JVM,它试图访问一个名为"RCSwitch"的C++库我创建了一个JavaClass
public class NativeRCSwitchAdapter {
private static final NativeRCSwitchAdapter instance = new NativeRCSwitchAdapter();
public static NativeRCSwitchAdapter getInstance(){
return instance;
}
private NativeRCSwitchAdapter(){};
static{
String path = NativeRCSwitchAdapter.class.getProtectionDomain().getCodeSource().getLocation().getPath();
System.load(path + "NativeRCSwitchAdapter.so");
}
// methods to redirect to native layer (C++)
public native void switchOn(String group, String channel);
public native void switchOff(String group, String channel);
}
然后我运行javac和javah,让java为我生成头文件。
我创建了一个 c++ 文件:
#include "NativeRCSwitchAdapter.h"
#include "RCSwitch.h"
#include <stdio.h>
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_NativeRCSwitchAdapter_switchOn(JNIEnv * env, jobject obj, jstring jsGroup, jstring jsChannel ){
cout<<"teststring output"<<endl;
const char *csGroup = env->GetStringUTFChars(jsGroup, 0);
const char *csChannel = env->GetStringUTFChars(jsChannel, 0);
char sGroup[6];
char sChannel[6];
for (int i = 0; i<5; i++) {
sGroup[i] = csGroup[i];
sChannel[i] = csChannel[i];
}
sGroup[5] = ' ';
sChannel[5] = ' ';
cout<<"ONON"<<endl;
cout<<sGroup<<endl;
cout<<sChannel<<endl;
RCSwitch mySwitch = RCSwitch();
//for testing purposes set to the ELRO Power Plugs
mySwitch.setPulseLength(300);
mySwitch.enableTransmit(0);
mySwitch.setRepeatTransmit(3);
mySwitch.switchOn(sGroup, sChannel);
}
现在这个文件使用RCSwitch库,而RCSwitch库又使用wiringPi库。
现在,如果我编译,我会运行这个:
g++ -shared -I/usr/jdk1.8.0/include -I/usr/jdk1.8.0/include/linux NativeRCSwitchAdapter.cpp -o NativeRCSwitchAdapter.so
但是,如果从java启动所有内容,则会收到此错误:(简单的main,创建我的对象的实例并运行switchOn((
java: symbol lookup error: /home/pi/applications/Pi-jAutomation433/RCSwitchJNIWrapper/src/NativeRCSwitchAdapter.so: undefined symbol: _ZN8RCSwitchC1Ev
自从我上次用 C 编码以来已经有时间了,所以请原谅我,但我相信这与编译器的链接阶段有关?或者编译器是否会自动检查所有依赖项,然后检查它们的 deps,直到找不到进一步的依赖项,然后将它们很好地链接在一起并将其包装在应用程序中?
哦,这是回购,如果有人关心,可以深入了解:Github存储库
感谢您对我的任何帮助!
更新
好的,所以我设法消除了这个错误。事实证明(好吧,我已经知道了,但是是的(当涉及到编译器知识时,我是一个安静C++傻瓜。无论如何,我设法更改了错误。我不知道我必须明确告诉 g++ 也包含 RCSwitch.cpp。好吧,现在我做到了。下一个错误 ;-(我想这一次应该很容易解决。我得到一个未定义的符号"pinMode"。此符号是布线Pi库的一部分。我是否必须包含在我的 java 文件中执行的所有 c 库?或者只有我访问的那个,之后的任何内容对 java 都无关紧要?
你的原生函数声明被 c++ 编译器破坏了。 在声明周围添加外部"C"以清除问题。
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
JNIEXPORT void JNICALL Java_NativeRCSwitchAdapter_switchOn(JNIEnv * env, jobject obj, jstring jsGroup, jstring jsChannel ){
#ifdef __cplusplus
}
#endif /* __cplusplus */
编辑:您需要将所有其他对象/库包含在共享库的创建中。
请参阅此动态链接库问答。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- specialized std::default_delete with QQmlComponent
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- Inference pytorch C++ with alexnet and cv::imread image
- Pybind11: init<> with lambda
- Incomings Call with Android Sip stack in Embarcadero C++ bui