android - 为android编译C库

标签 android c android-studio android-ndk

作为概念证明,我正在尝试编译和利用 this 的强大功能Android 应用程序的库。我正在使用安卓工作室。到目前为止我所做的是:

  1. 已安装 NDK 和 SDK(如果可能,我希望目标版本为 android 4.0.3 及更高版本)
  2. 在 Android Studio 中创建了一个 android 项目
  3. 中创建了 JNI 文件夹
  4. 将库的所有内容存储在我的 JNI 文件夹中
  5. 将我的 build.gradle 链接到源中存在的 Android.MK 文件

    externalNativeBuild {
         ndkBuild {
             path 'src/main/jni/Android.mk'
         }
    }
    
  6. 设置 ProductFlavors 以避免尝试为库不支持的架构进行构建(我在这里可能已经错了)

    productFlavors {
        dev { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' }
        develx86 { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' }
        production { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' }
        productionx86 { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' }
    }
    
  7. 在这一点上,我注意到一些文件,如 cpu-miner.c 丢失了一些文件,包括将它们突出显示为丢失,特别是

    #include <curl/curl.h>
    #include <openssl/sha.h>`
    

所以我去这两个库的官方网站下载了源码,创建了两个对应的文件夹,把所有的文件都放在那里。在 OpenSSL 中有一个 h.in 文件——据我所知是一个配置。我能够从 here 获得配置的一个(也可能是我弄错的地方)

  1. 我已使用以下内容将 Application.mk 添加到 JNI 文件夹根目录 APP_ABI:= armeabi armeabi-v7a x86 以排除一些我不支持的架构。

在这一点上,我遇到了一些问题 - 其中之一是我实际上无法使用 NDK-build 构建我的 JNI 东西 - sched.h 没有得到解决(即使我将 API 版本增加到 20)。这会导致如下错误:

JNI/cpu-miner.c:473:2: error: use of undeclared identifier 'cpu_set_t'
    cpu_set_t set;
jni/cpu-miner.c:474:12: error: use of undeclared identifier 'set'
    CPU_ZERO(&set);

所以问题是:

  1. 如何强制构建解析 sched.h
  2. 我的方法是否正确地下载并添加了缺失库的源代码,或者还有其他一些选择——我假设确实有一个,因为它们没有包含在库源代码中?如果是这样 - 有人可以提供说明如何使用 NDK 执行此操作(或者我使用什么并不重要?)
  3. 一旦我修复了库构建,只为我的 c 文件生成 java 接口(interface)并开始使用它们就足够了吗?还是需要考虑其他步骤?

    如果您需要任何其他详细信息,请随时询问,在此先感谢您。
    免责声明:我是 a.NET 开发人员,所以请在适用的情况下更具体地说明 android/C 方面的内容。
    免责声明 2:此程序是出于教育目的作为概念证明而制作的。

最佳答案

看起来 cpu_set_t 直到 android-21 才进入 NDK header 。

NDK r14(未发布,但应该在下周发布)已完全重做 header ,以便您可以访问结构定义和常量(无论您需要的 API 是否在 android-21 之前可用是一个不同的问题)。要使用它们,请捕获 r14 beta并按照 unified headers 的说明进行操作.

关于android - 为android编译C库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428467/

相关文章:

c - 创建大于 100000 的数组时出现段错误

java - Android实现中自定义Listview适配器的问题

android - 缺少 Android Studio git/linecount 工具栏

android - 如何将自定义文件导入 APK

java - 错误 :Execution failed for task , 以非零退出值 1 结束

java - Android Onclick优先级: ListView or ImageView in ListView?

c - 我陷入了无法完成的步骤

c - 如何将一个字节写入特定内存地址的寄存器?

android - 如何从数据库中获取一个值并将其显示在android中的 TextView 中

android - 安装 Android 更新 - "Application Not Installed"错误