Не удается найти библиотеки в панаме проекта на macOs
Я пытаюсь запустить код cpp через Java, используя Project Panama, и получаю сообщение об ошибке, потому что моя библиотека не загружается.
СРР-код:
// 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++ -dynamiclib -current_version 1.0 -o libmyrectangle.dylib MyRectangle.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);
}
}
и я получил ошибку: Исключение в потоке "основной" java.lang.UnsatisfiedLinkError: нет myrectangle в java.library.path: ~/Users/project-panama-examples
Кажется, что java не видит мою библиотеку, но почему? Это ошибка?
1 ответ
Панама пока не совместима сarm64
, то есть M1 MacBook. Я предполагаю, что ваш один из тех?
Вы по-прежнему можете запускать свой код внутри контейнера докеров с архитектурой x86_64. Для собственных экспериментов я собрал этот dockerfile.