使用 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;
}
然后是我的javaclass和界面
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”文件类型。在你的情况下,
文件名 = "untitled1"
我实际上是想开一家图书馆。所以(我用 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;
}
然后是我的javaclass和界面
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”文件类型。在你的情况下,
文件名 = "untitled1"