Использование существующих файлов кода C для встраивания Android и передачи информации из моего кода java в код C - PullRequest
1 голос
/ 24 апреля 2020

Я понимаю, что мне нужно взглянуть на использование NDK и JNI для интеграции этих двух C и Java, однако все учебные пособия, похоже, указывают на написание вашего собственного C кода. Мне дали огромный каталог, который включает в себя. C файлы и соответствующие .H файлы. Мне сказали, что этот C код был создан MatLab. Пожалуйста, помните, что я Java разработчик, и мои C знания не велики. В этом каталоге находятся 2 файла .mk, а также несколько других типов файлов .bat .rsp et c .., всего около 360 файлов. Мне нужно построить эту реализацию, иметь возможность передавать информацию нескольким функциям и получать информацию обратно. Какому процессу я должен следовать, чтобы достичь этого, потому что информация в Интернете говорит о создании файлов заголовков и т. Д. c .. Однако файлы заголовков в C уже существуют? Я думаю, что мой самый важный вопрос - как мне интегрировать это и построить его, чтобы я мог затем использовать JNI для взаимодействия с C кодом?

Надеюсь, это имеет смысл, пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения , Приложение C просто принимает мои данные, выполняет некоторые математические операции и предоставляет мне объект вывода с требуемыми мне данными.

Пожалуйста, помогите, если можете.

1 Ответ

1 голос
/ 25 апреля 2020

Ваша стратегия будет следующей:

  1. Создать Android проект с поддержкой собственного кода C / C ++, например, как здесь: https://developer.android.com/studio/projects/add-native-code. И ваша цель - создать следующую цепочку:

    [Your Android Java app] --> [JNI Java API] --> [JNI native] --> [MatLab native]
    

    JNI просто направляет Java вызов целевой функции MatLab.

  2. Генерация C код только для функции Matlab , которая вам действительно нужна. Проверьте документацию (https://www.mathworks.com/help/dsp/ug/generate-c-code-from-matlab-code-1.html):

    Вам не нужно генерировать код для всего приложения MATLAB. Если у вас есть определенные c части, требующие большого объема вычислений, сгенерируйте код из этих частей, чтобы ускорить ваш алгоритм. Сделайте код пригодным для генерации кода

  3. Генерация JNI с помощью методов, разработанных вами самостоятельно: например, у вас будет MatLabJniApi.java (JNI Java API), и вы получите com_your_MatLabJniApi.ccom_your_MatLabJniApi.h) в результате выполнения команды javac -h . MatLabJniApi.java (собственная реализация JNI).

  4. Наконец, вызовите функцию MatLab из сгенерированных собственных файлов C / C ++ JNI:

    #include <matlab_header_with_foobar.h>
    ...
    JNIEXPORT void JNICALL Java_com_your_MatLabJniApi_foobar (JNIEnv* env, jobject thisObject) {
       ...
       foobar_from_matlab();
       ...
    }
    

    Сохраняйте JNI ясным и минимальным: это всего лишь мост к коду, созданному MatLab.

  5. Поместите все файлы C / C ++ в одну папку (cpp/ или jni/ в зависимости от вашей Android структуры проекта), поэтому они будут скомпилированы вместе cmake (или ndk-build, в зависимости от выбранного метода компиляции JNI).

Удачи!

PS: пример Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mymatlab         # Name of your module
LOCAL_SRC_FILES := 1.c 2.c 3.c   # Sources, and here you can try $(wildcard *.c)
include $(BUILD_STATIC_LIBRARY)  # This means to build libmymatlab.a
...