使用现有的 C 代码文件构建 Android 并将信息从我的 java 代码传递到 C 代码
Using existing C code files to build in Android and pass information from my java code to the C code
我知道我需要考虑使用 NDK 和 JNI 来集成这两个 C 和 Java,但是所有教程似乎都指向编写您自己的 C 代码。我得到了一个巨大的目录,其中包括 .C 文件和相应的 .H 文件。我被告知此 C 代码是由 MatLab 生成的。请记住,我是一名 Java 开发人员,我的 C 知识并不丰富。在这个目录中有 2 个 .mk 文件和一些其他文件类型以及 .bat .rsp 等,所有这些都是关于 360 文件的。我需要构建这个实现,能够将信息传递给一些函数并接收返回的信息。我需要遵循什么过程来实现这一点,因为在线信息谈到创建头文件等。但是 C 中的头文件已经存在?我认为我最重要的问题是如何集成和构建它以便我可以使用 JNI 与 C 代码交互?
希望我说得有道理,如果您需要任何说明,请告诉我。 C 应用程序只是接受我的输入并进行一些数学运算,然后为我提供一个包含我需要的数据的输出对象。
如果可以请帮忙
您的策略如下:
创建具有本机 C/C++ 代码支持的 Android 项目,例如就像这里:https://developer.android.com/studio/projects/add-native-code。您的目标是创建以下链:
[Your Android Java app] --> [JNI Java API] --> [JNI native] --> [MatLab native]
JNI 只是编组对目标 MatLab 函数的 Java 调用。
只为您真正需要的 Matlab 函数 生成 C 代码 。检查文档 (https://www.mathworks.com/help/dsp/ug/generate-c-code-from-matlab-code-1.html):
You do not have to generate code for the entire MATLAB application. If you have specific portions that are computationally intensive, generate code from these portions in order to speed up your algorithm.
Make Code Suitable for Code Generation
用自己设计的方法生成JNI:例如您将拥有 MatLabJniApi.java
(JNI Java API) 并且由于 javac -h . MatLabJniApi.java
命令 (JNI本机实现)。
最后,从生成的 JNI 原生 C/C++ 文件调用 MatLab 函数:
#include <matlab_header_with_foobar.h>
...
JNIEXPORT void JNICALL Java_com_your_MatLabJniApi_foobar (JNIEnv* env, jobject thisObject) {
...
foobar_from_matlab();
...
}
保持 JNI 清晰和最小化:它只是通往 MatLab 生成的代码的桥梁。
- 将所有 C/C++ 文件放入一个文件夹中(
cpp/
或 jni/
,具体取决于您的 Android 项目结构),因此它们将一起编译cmake
(或 ndk-build
,取决于选择的编译 JNI 的方法)。
祝你好运!
P.S.: 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
我知道我需要考虑使用 NDK 和 JNI 来集成这两个 C 和 Java,但是所有教程似乎都指向编写您自己的 C 代码。我得到了一个巨大的目录,其中包括 .C 文件和相应的 .H 文件。我被告知此 C 代码是由 MatLab 生成的。请记住,我是一名 Java 开发人员,我的 C 知识并不丰富。在这个目录中有 2 个 .mk 文件和一些其他文件类型以及 .bat .rsp 等,所有这些都是关于 360 文件的。我需要构建这个实现,能够将信息传递给一些函数并接收返回的信息。我需要遵循什么过程来实现这一点,因为在线信息谈到创建头文件等。但是 C 中的头文件已经存在?我认为我最重要的问题是如何集成和构建它以便我可以使用 JNI 与 C 代码交互?
希望我说得有道理,如果您需要任何说明,请告诉我。 C 应用程序只是接受我的输入并进行一些数学运算,然后为我提供一个包含我需要的数据的输出对象。
如果可以请帮忙
您的策略如下:
创建具有本机 C/C++ 代码支持的 Android 项目,例如就像这里:https://developer.android.com/studio/projects/add-native-code。您的目标是创建以下链:
[Your Android Java app] --> [JNI Java API] --> [JNI native] --> [MatLab native]
JNI 只是编组对目标 MatLab 函数的 Java 调用。
只为您真正需要的 Matlab 函数 生成 C 代码 。检查文档 (https://www.mathworks.com/help/dsp/ug/generate-c-code-from-matlab-code-1.html):
You do not have to generate code for the entire MATLAB application. If you have specific portions that are computationally intensive, generate code from these portions in order to speed up your algorithm. Make Code Suitable for Code Generation
用自己设计的方法生成JNI:例如您将拥有
MatLabJniApi.java
(JNI Java API) 并且由于javac -h . MatLabJniApi.java
命令 (JNI本机实现)。最后,从生成的 JNI 原生 C/C++ 文件调用 MatLab 函数:
#include <matlab_header_with_foobar.h> ... JNIEXPORT void JNICALL Java_com_your_MatLabJniApi_foobar (JNIEnv* env, jobject thisObject) { ... foobar_from_matlab(); ... }
保持 JNI 清晰和最小化:它只是通往 MatLab 生成的代码的桥梁。
- 将所有 C/C++ 文件放入一个文件夹中(
cpp/
或jni/
,具体取决于您的 Android 项目结构),因此它们将一起编译cmake
(或ndk-build
,取决于选择的编译 JNI 的方法)。
祝你好运!
P.S.: 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