JavaCPP - как на самом деле генерировать C ++ JNI-оболочки? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь использовать JavaCPP для создания привязок Java для некоторой библиотеки C ++.Процесс имеет 2 аспекта

  • Необходимо создать общую библиотеку Linux (.so), содержащую собственные точки входа (JNIEXPORT).Так получилось, что моя библиотека только для заголовков, поэтому я просто передаю include в JavaCPP
  • . Необходимо создать класс Java с помощью методов, использующих ключевое слово «native», чьи подписи соответствуют сигнатурам на нативной стороне

Файл "свойств" Java (часть, которая описывает, как создать .so и как генерировать файл Java) выглядит следующим образом:

@Properties(
    //target = "Client",  // NOTE: with this commented, .so gets built; with it enabled, Java class gets written
    value = @Platform(
        includepath = {"jnigen/src/main/cpp/mpf"},
        include = "ClientWrapper.hpp"
    )
)
public class Mpf implements InfoMapper {
    public void map(InfoMap infoMap) {
        infoMap.put(new Info("mpf::ClientWrapper").pointerTypes("Client"));
    }
}

Проблема в том, что яне могу за всю жизнь генерировать привязки C ++.Я знаю, потому что .so не содержит точек входа, глядя на это с nm -D X.so.Если я укажу свойство "target", класс Java будет выведен, что выглядит хорошо, но не .so.Если я пропущу свойство target, файл .so будет успешно создан, но не имеет привязок .Я также вижу, что он не получил их, передав -nodelete в java -jar javacpp.jar, чтобы он сохранил сгенерированные файлы cpp - они содержат только маршаллинг, а не мои вещи (один класс).

JavaCPPдокументация - это кошмар, а шаги настолько запутаны, что я не могу разобраться.Предложения по альтернативным библиотекам также приветствуются.Спасибо.

1 Ответ

0 голосов
/ 24 декабря 2018

Новые Рецепты картографирования для библиотек C / C ++ Вики-страница должна прояснить все это, но дайте мне знать, если что-то еще неясно, и я приведу здесь дополнительную точность.

В этом случае мы могли бы вызвать JavaCPP на Mpf с установленным значением @Properties(target="Client", ...), создав класс с именем Client, поэтому последовательность команд будет выглядеть следующим образом:

$ javac -cp javacpp.jar Mpf.java
$ java -jar javacpp.jar Mpf
$ javac -cp javacpp.jar Client.java
$ java -jar javacpp.jar Client
...