Как я могу создать интерфейс JNI для файла Traceroute C - PullRequest
0 голосов
/ 27 мая 2019

Я работаю над приложением Android, которое является сетевой утилитой. Одной из утилит является реализация traceroute с использованием Activity и XML-файла. Реализация traceroute в java является своего рода болью, поэтому я посмотрел на код JNI и C. Есть утилита, которая включает в себя множество инструментов linux под названием busybox. Это с открытым исходным кодом и имеет traceroute. вот код на github https://raw.githubusercontent.com/mirror/busybox/master/networking/traceroute.c Мой вопрос, как я могу реализовать интерфейс JNI в Java для этого файла. Скомпилированный файл действует как инструмент командной строки, который вы запускаете и передаете параметр хоста, который вы хотите отследить. Означает ли это, что я должен реализовать только основной метод в JNI. Кроме того, этот файл не имеет методов типа JNI, поэтому я не смогу напрямую взаимодействовать с ним. Мне нужно создать еще один C-файл, который вызывает основной метод traceroute с использованием C-кода JNI. Любой вклад оценили

1 Ответ

0 голосов
/ 27 мая 2019

Вы хотите вызвать этот метод: common_traceroute_main(int op, char **argv)

Вы должны создать общую библиотеку, используя код из github.Взгляните сюда

http://jnicookbook.owsiak.org/recipe-No-001/

Получив свою библиотеку, вы должны подготовить параметры внутри Java и передать их в код JNI, где вам нужно распаковать их и преобразовать в то, чтоожидается common_traceroute_main.

Например.Вы можете передать массив String и преобразовать их в char **argv.

http://jnicookbook.owsiak.org/recipe-No-009/

Затем все, что вам нужно сделать, это вызвать common_traceroute_main из вашей оболочки JNI.

черновик решения

Вам понадобится код Java, например, что-то вроде этого

public class TraceCaller {
  public static native callTraceRoute(int op, String[] args);
}

, как только вы скомпилируете его с помощью javac -h headers TraceCaller, вы получитенайти заголовочный файл C.

Внутри этого заголовочного файла вам нужно будет извлечь значения из массива строк.Посмотрите здесь (https://github.com/mkowsiak/jnicookbook/blob/master/recipeNo038/java/recipeNo038/PassHashMap.java), чтобы получить представление о том, как извлечь String объекты из массива внутри кода JNI и превратить их в char*.

Как только вы это сделаете (внутри JNI) и: int op и массив char *, вы можете просто вызвать подпрограмму: common_traceroute_main.

Как только она закончится, вы должны передать данные обратно (либо как возвращаемое значение, либо через объект, переданный вJNI).

Посмотрите здесь пример, который показывает, как передать String обратно в Java:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo010

И все готово:)

...