为android编译C库

时间:2017-02-24 00:00:35

标签: android c android-studio android-ndk

作为一个概念证明,我正在尝试编译并利用this库的强大功能来安装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'
         }
    }
    
  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>`
    
  8. 所以我去了这两个图书馆的官方网站并下载了资源,创建了两个相应的文件夹并将所有文件放在那里。在OpenSSL中有一个h.in文件 - 我理解的配置。我能够从here获得一个配置的(也可能是我犯错误的地方)

    1. 我已将Application.mk添加到JNI文件夹根目录,其中包含以下内容APP_ABI:= armeabi armeabi-v7a x86,以排除我不支持的一些体系结构。
    2. 此时,我遇到了一些问题 - 其中一个问题是我实际上无法使用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接口并开始使用它们还是需要考虑其他步骤?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

尝试在包含<sched.h>

之前添加此内容
#define _GNU_SOURCE

如果它不起作用,只需在cpu-miner.c文件中添加以下结构:

#define CPU_SETSIZE 1024
#define __NCPUBITS  (8 * sizeof (unsigned long))
typedef struct
{
   unsigned long __bits[CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;