作为概念证明,我正在尝试编译和利用 this 的强大功能Android 应用程序的库。我正在使用安卓工作室。到目前为止我所做的是:
- 已安装 NDK 和 SDK(如果可能,我希望目标版本为 android 4.0.3 及更高版本)
- 在 Android Studio 中创建了一个 android 项目
- 在 中创建了 JNI 文件夹
- 将库的所有内容存储在我的 JNI 文件夹中
将我的 build.gradle 链接到源中存在的 Android.MK 文件
externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } }
设置 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' } }
在这一点上,我注意到一些文件,如 cpu-miner.c 丢失了一些文件,包括将它们突出显示为丢失,特别是
#include <curl/curl.h> #include <openssl/sha.h>`
所以我去这两个库的官方网站下载了源码,创建了两个对应的文件夹,把所有的文件都放在那里。在 OpenSSL
中有一个 h.in 文件——据我所知是一个配置。我能够从 here 获得配置的一个(也可能是我弄错的地方)
- 我已使用以下内容将 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);
所以问题是:
- 如何强制构建解析
sched.h
? - 我的方法是否正确地下载并添加了缺失库的源代码,或者还有其他一些选择——我假设确实有一个,因为它们没有包含在库源代码中?如果是这样 - 有人可以提供说明如何使用 NDK 执行此操作(或者我使用什么并不重要?)
一旦我修复了库构建,只为我的 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/