为android编译C库

Har*_*uck 11 c android android-ndk android-studio

作为一个概念证明,我正在尝试编译和利用这个库的功能为Android应用程序.我正在使用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'
         }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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' }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 在这一点上,我注意到一些像cpu-miner.c这样的文件缺失,其中包括突出显示它们缺失,具体而言

    #include <curl/curl.h>
    #include <openssl/sha.h>`
    
    Run Code Online (Sandbox Code Playgroud)

所以我去了这两个库的官方网站并下载了源代码,创建了两个相应的文件夹并将所有文件放在那里.在OpenSSL那里有一个h.in文件 - 我理解的配置.我能从这里得到一个配置的(也可能是我犯错误的地方)

  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);
Run Code Online (Sandbox Code Playgroud)

所以问题是:

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

    如果您需要,请随时询问任何其他详细信息,请提前感谢.
    免责声明:我是一个.NET开发人员所以请在适用的情况下更具体地了解android/C的内容.
    免责声明2:此计划是出于教育目的而作为概念证明.

Dan*_*ert 1

看起来cpu_set_t直到 android-21 才将其纳入 NDK 标头。

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