使用 jna 加载 lib .so
load lib .so with jna
我实际上正在尝试打开一个库。所以(我用 c++ 做到了(用 JNA 我的问题是当有静态变量时我无法打开库。但是我必须在我的库中使用 un singleton,所以我正在寻找为什么静态变量不能与 JNA 一起使用来证明它是一个小库
有 .h 文件:
#ifndef UNTITLED1_LIBRARY_H
#define UNTITLED1_LIBRARY_H
#include <iostream>
class library {
private:
static char* h;
public:
int hello();
};
extern "C" int hello(){
library lib;
return lib.hello();
}
#endif
然后是我的.cpp文件:
#include "library.h"
#include "ecrire.h"
#include <iostream>
int library::hello() {
h = (char*)"hello world";
std::cout<<h<<std::endl;
return 45;
}
然后是我的 Java 类和接口
public class Westgard {
static {
System.setProperty("jna.library.path","../logic/resources/calculator");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int maj = InterfaceLibWestgard.INSTANCE.hello();
System.out.println(maj);
}
}
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface InterfaceLibWestgard extends Library {
int hello();
static InterfaceLibWestgard INSTANCE = (InterfaceLibWestgard)
Native.loadLibrary("../logic/resources/calculator/libuntitled1.so",
InterfaceLibWestgard.class);
}
因此,如果我尝试这样做,它将无法正常工作,但是当从 .h 中删除静态时,它起作用了,没有人知道为什么我一直在寻找 4-5 小时仍然不知道为什么......
这是我的问题日志:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load
library '../logic/resources/calculator/libuntitled1.so': Native library
(linux-x86-64/../logic/resources/calculator/libuntitled1.so) not found in
resource path ([file:/opt/java/jdk1.8.0_151/jre/lib/resources.jar,
您已经声明library::h
但尚未定义它。您需要添加
char* library::h = 0;
在您的 CPP 文件中。
据推测,库要么编译失败,要么正在编译,但期望在另一个库中定义这个缺失的符号。
您可以使用Native.load()
而不是Native.loadLibrary()
。
检查下面的代码,
public interface MyLibrary extends Library {
int myMethod();
}
static {
MyLibrary lib = (MyLibrary)Native.load("untitled1" , MyLibrary.class);
}
您可以在资源位置添加文件,并以上述方式轻松加载它。您应该排除"lib"前缀和".so"文件类型。在您的情况下,
文件名 ="无标题1">
使用 JNA 访问本机动态库
相关文章:
- 在linux中,mono调用我的.so-lib返回System.EntryPointNotFoundException
- /lib/libstdc++.so.6:没有可用的版本信息
- 链接器错误:在包含 .so lib 后未定义对 xxx 的引用
- 没有规则来设定目标'/usr/lib/x86_64-linux-gnu/libboost_filesystem.so'
- 使用 jna 加载 lib .so
- C++: 错误: opencv_core: 即使所需的 .so 文件位于 /usr/lib/ 中,也没有这样的文件或目录
- 我想从安卓工作室访问 .so lib 及其 cpp 文件的方法
- 如何在 C++ 中修复"/usr/bin/ld: warning: liblber-2.4.so.2, needed by //usr/lib/x86_64-linux-gnu/libcurl-gnu
- 将 lib*.so 添加到 cmake
- 没有规则来使目标"TBB_ENV_LIB_DEBUG-NOTFOUND","lib/libopencv_core.so.3.2.0"需要
- lib(libmyshlib.so,libmyshlib.so.1,libmyshlib.so.1.0)最好添加到我的项
- ./libmylib.so:未定义的"submarinex::LIB::kCount"
- 为什么我可以不将 SSL lib(-lssl) 链接到 so 的制作文件中?
- "/usr/lib/libstdc .so.6: version `GLIBCXX_3.4.15' not found"是什么意思,我该如何解决?
- 从.lib切换到.so后,Android应用程序崩溃
- "/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found`",如何解决?
- make[2]: *** 没有规则在 CGAL 中将目标 '/usr/lib/i386-linux-gnu/libmpfr.so'
- 编译 fortran 文件"/usr/bin/ld: errno: TLS definition in /lib/libc.so.6"
- /usr/lib/x86_64-linux-gnu/libstdc++.so.6:未找到版本 CXXABI_1.3.8'
- ImportError: /usr/lib/libboost_python.so.1.54.0: 未定义的符号: PyC