链接Android项目中的共享库

时间:2017-04-27 16:47:45

标签: android-studio android-ndk shared-libraries

我需要在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)

最后一行是给我错误的那一行。

这是树层次结构:

http://imgur.com/a/G3I0y

我也试过这个解决方案但没有成功: How to build FFmpeg (ver 3.1.1) on Android Studio (ver 2.1.2)

我一直在寻找我做错了几个小时......

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的层次结构错误。 请按照以下步骤操作:

  1. 在jni文件夹中创建“lib”文件夹,并根据目标文件夹放置共享库。这看起来应该是:'jni / lib / armeabi-v7a / libfinal.so'。

  2. 只预构建在jni / lib文件夹中的这些.so库。为此,请将此行LOCAL_SRC_FILES := libfinal.so更改为LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libfinal.so。这将在jni文件夹中搜索lib文件夹,然后根据你的cpu架构搜索目标文件夹中的libfinal.so lib。

  3. 请注意您的gradle脚本。你应该像这样添加你的Android.mk文件,

    externalNativeBuild {
    ndkBuild {
        path 'src/main/jni/Android.mk'
        }
    }
    
  4. 在构建Android.mk文件后,gradle会根据目标arch将预构建的库放入main / jni文件夹中。为此,请将此行添加到gradle,

    sourceSets.main {
            jni.srcDirs = []
            jniLibs.srcDir 'src/main/libs'
        }