我需要在android studio项目中导入一个用C文件编写的单个函数。此函数调用位于其他文件中的其他函数(总共50多个C文件和标题)。
这个项目已经包含一个C ++文件,因为我正在使用NDK来编译OpenCV4android。
我已经使用Mingw和GCC来编译共享库(libfinal.so)但是一旦我尝试导入它们,感谢NDKbuild我得到了这个毫无意义的错误:
Error:Execution failed for task ':app:ndkBuild'.
> Process 'command 'C:/SDK/ndk-bundle/ndk-build.cmd'' finished with non-zero exit value 2
这是Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
/some opencv stuff/
include $(CLEAR_VARS)
LOCAL_MODULE := final
LOCAL_SRC_FILES := libfinal.so
LOCAL_EXPORT_C_INCLUDES := C:\SDK\NDKOpencvTest1\app\src\main\jni\include
include $(PREBUILT_SHARED_LIBRARY)
最后一行是给我错误的那一行。
这是树层次结构:
我也试过这个解决方案但没有成功: How to build FFmpeg (ver 3.1.1) on Android Studio (ver 2.1.2)
我一直在寻找我做错了几个小时......
非常感谢您的帮助!
答案 0 :(得分:1)
您的层次结构错误。 请按照以下步骤操作:
在jni文件夹中创建“lib”文件夹,并根据目标文件夹放置共享库。这看起来应该是:'jni / lib / armeabi-v7a / libfinal.so'。
只预构建在jni / lib文件夹中的这些.so库。为此,请将此行LOCAL_SRC_FILES := libfinal.so
更改为LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libfinal.so
。这将在jni文件夹中搜索lib文件夹,然后根据你的cpu架构搜索目标文件夹中的libfinal.so lib。
请注意您的gradle脚本。你应该像这样添加你的Android.mk文件,
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
在构建Android.mk文件后,gradle会根据目标arch将预构建的库放入main / jni文件夹中。为此,请将此行添加到gradle,
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}