我试图通过Java使用项目Panama运行cpp代码,但出现错误,因为我的库没有加载。
cpp代码:
// MyRectangle.cpp
#include <iostream>
#include <cstring>
class Rectangle {
int width, height;
public:
Rectangle(int, int);
int area() {return width*height;}
};
Rectangle::Rectangle(int w, int h) {
this->width = w;
this->height = h;
}
// Expose C ABI for Panama to call into.
extern "C" int rectArea(int, int);
int rectArea(int w, int h) {
std::cout << "Inside C++ Code " << std::endl;
Rectangle rect(w,h);
return rect.area();
}
我是这样编译的:g++ -动态库-当前版本1.0 -o库我的矩形.dylib我的矩形. cpp
和Java代码:
class MyRectangle {
public static void main(String[] args) throws Throwable {
System.loadLibrary("myrectangle");
var cLinker = CLinker.systemCLinker();
// C function int rectArea(int w, int h)
MethodHandle rectAreaMH = cLinker.downcallHandle(cLinker.lookup("rectArea").get(),
FunctionDescriptor.of(ValueLayout.OfInt.JAVA_INT, ValueLayout.OfInt.JAVA_INT, ValueLayout.OfInt.JAVA_INT));
// Return area of rectangle
int w = 8;
int h = 2;
int area = (int) rectAreaMH.invokeExact(w, h);
System.out.printf("MethodHandle calling rectArea(%d, %d) = (%d)\n", w, h, area);
}
}
我得到一个错误:线程“main”java.lang中出现异常。未满足链接错误:java.library.path中没有我的矩形框:~/用户/项目-巴拿马-示例
似乎java没有看到我的库,但是为什么呢?是一个bug吗?
1条答案
按热度按时间ohfgkhjo1#
巴拿马还不兼容
arm64
,也就是M1 MacBook。我想你的是其中之一?你仍然可以在一个x86_64架构的Docker容器中运行你的代码,为了我自己的实验,我把这个dockerfile放在一起。