Android - 使用JNI生成的C文件

时间:2017-06-22 16:06:38

标签: android c cmake java-native-interface

我正在尝试使用C文件创建应用程序。

实际上,C文件是从matlab生成的(~20个文件,.c.h),我没有修改这些文件。

要将这些文件与JNI一起使用,我创建了一个使用JNI的其他C文件:native-lib.c

所以matlab生成的C文件是通过native-lib.c使用的(我使用网络上的tuto来编写这个文件)。

我有c文件的这种架构:

src/
-- jni/
---- native-lib.c
---- include/
-------- All the c files generated from matlab

这是native-lib.c(我在这里简化):

#include <jni.h>
#include "include/function1.h"


JNIEXPORT jint JNICALL
My_project_function1(JNIEnv* env, jobject obj, Function1_Args args) {

    int x = function1(args);
    return x;

}

etc...

要构建C库,我使用此文件:CMakeList.txt

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib SHARED src/jni/native-lib.c)

include_directories(src/jni/include)

find_library(log-lib log)

target_link_libraries(native-lib ${log-lib})

但是这个文件CMakeList.txt不起作用!文件夹include/中的所有文件都不包含在项目中(只能识别native-lib.c)。

所以我想要包含include/文件夹的文件而不修改它们(不添加JNIEXPORTJNICALL等等。)

我几乎从不使用C,我对C代一无所知。所以我不知道该怎么做,而且我不理解网上发现的大多数答案:(

有人理解为什么CMakeList.txt不起作用?你有解决方案来解决我的问题吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我不熟悉CMake,但是,你可能想要将src / jni / include文件夹添加为第二个库源和静态链接到native-lib,或者直接添加src / jni / include的内容add_library的参数(native-lib SHARED ...)。请注意,include_directories用于#include路径,而不用于src位置。

答案 1 :(得分:0)

最后我找到了解决问题的方法:

事实上非常简单:

cmake_minimum_required(VERSION 3.4.1)

file(GLOB sources_c
    "src/jni/include/*.h"
    "src/jni/include/*.c"
    "src/jni/native-lib.c"
)

add_library(native-lib SHARED ${sources_c})

find_library(log-lib log)

target_link_libraries(native-lib ${log-lib})

我只是将所有C文件放在变量sources_cfile(GLOB sources_c ...)

并且,在CMakeList.txt中,似乎纯C文件和JNI-C文件(带有JNIEXPORT的C文件,等等...)之间存在任何区别。

我希望它会有所帮助!