2013-12-04 4 views
2

У меня уже есть код C, который я использую в других проектах. Я исследовал способ повторного использования кода C в своем приложении для Android и прошел через NDK и получил все отработанное.Android ndk jni автогенерация функций

Но для того, чтобы это сработало, мне пришлось создать этот файл JNI, который в основном завершает мой C-код.

Например,

вот мой C код:

multiply.h 
int mult(int val1, int val2); 

multiple.c 
int mult(int val1, int val2) { return val1 * val2; } 

Тогда я должен был создать множественно-JNI файл, который выглядит следующим образом:

multiply-jni.c 

#include <jni.h> 
#include "multiply.h" 

jint Java_com_example_ndktest_NativeLib_mult 
(JNIEnv * env, jobject obj, jint value1, jint value2) 
{ 
    return mult(value1, value2); 
} 

И тогда я использую инструмент ndk-build для создания общей библиотеки.

Мой вопрос: есть ли способ сгенерировать файл multiply-jni.c автоматически? Я действительно не хочу делать это вручную, так как код C может быть очень большим ...

ответ

2

Вы можете попробовать проанализировать файл .h и испустить файл .java. С JNI вы можете разработать Java-класс с естественными методами Java, а затем реализовать их на C. Часто бывает полезно выполнить некоторую реализацию на Java, чтобы ваш класс мог иметь открытый интерфейс и частные собственные объявления методов. После компиляции вашего .java-файла в файл .class вы можете использовать javah для создания файла .h для реализации JNI.

Если вы предпочитаете выполнять всю работу на Java, вы можете использовать JNA. Он использует классы Java для вызова библиотеки JNA (которая сама использует JNI). JNAerator может преобразовывать файлы .h в требуемый код Java. Чтобы эффективно использовать JNAerator, вы можете переписать файл .h, чтобы просто включить типы и функции, которые вы хотите использовать в Java.

Обновление: В некоторой степени похожий на JNAerator - SWIG. «SWIG обычно используется для синтаксического анализа интерфейсов C/C++ и генерации« кода клея », необходимого для ... целевых языков для вызова ... кода C/C++».

Снова упрощение файла заголовка выгодно. SWIG также позволяет вам аннотировать объявления C, чтобы направлять его на создание кода. В нем также используется JNI.

+1

Я читал вопрос о попытке автогенерации файла C, содержащего JNI-совместимые функции, обертывающие существующие JNI-несовместимые. –

+0

@ChrisStratton Я думаю, что ты прав. Я добавил информацию о генерации кода Java и C с помощью SWIG. –

+0

SWIG был именно тем, что я искал! – pdiddy

Смежные вопросы