2017-02-24 127 views
11

作为一个概念证明,我试图编译和利用Android应用程序的this库的强大功能。我正在使用android studio。我到目前为止已经做的是:为Android编译C库

  1. 安装NDK和SDK(我想针对Android版本4.0.3及以上,如果可能的话)
  2. 创建Android Studio中的Android项目
  3. 创建的在
  4. JNI文件夹存储在库中的所有内容在我的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>` 
    

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

  1. 我已将Application.mk添加到带有以下内容的JNI文件夹根APP_ABI:= armeabi armeabi-v7a x86来排除一些我不支持的体系结构。

在这一点上,我有一些问题 - 其中之一是,我无法真正建立我的JNI的东西用NDK编译 - 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. 只要我修复了库构建,就可以生成java接口我的C文件,并开始使用它们或有其他步骤要考虑?

    如果您需要任何其他细节,请随时提出,谢谢您提前。
    声明:我是一个.NET开发人员,所以请在适用的情况下更详细地介绍有关android/C的东西。
    免责声明2:此程序是为教育目的作为概念验证。

+1

的包括模样的工作。它所键入的问题没有定义。如果你看看https://android.googlesource.com/platform/development/+/73a5a3b/ndk/platforms/android-20/include/sched.h - 有有趣的宏观后卫'_GNU_SOURCE' – j2ko

+0

其实我有这个在cpu-miner.c – HardLuck

+1

开头的'#define _GNU_SOURCE'只是说这个问题可能与NDK上下文中'_GNU_SOURCE'宏的含义有某种关系。 – j2ko

回答

1

它看起来像cpu_set_t直到android-21没有进入NDK头。

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

+0

将api版本提升为21使得代码不是红色的,但错误dustring的构建仍然存在,并且包含本身变灰。我已经检查过,它现在指向版本21 – HardLuck

+0

我的猜测是它只对某些ABI失败。尝试@ AlexCohn直接运行'ndk-build'的建议。如果可行,请尝试扩展'APP_ABI'以包含armeabi-v7a和x86,直到找到失败的一个为止。任何这些失败命令的输出都会有所帮助。 –

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; 
+0

谢谢。这有助于我进一步发展,但现在我有像'jni/cpu-miner.c:1487:错误:未定义引用'json_object_get'',jni/compat/jansson/jansson.h:109 :error:未定义引用'json_delete'','jni/cpu-miner.c:2900:错误:未定义引用'json_load_file''等等。 – HardLuck

+0

你有json库吗? 尝试在您的Android.mk中添加LOCAL_LDLIBS:= -ljson – BhanuSingh

+0

再次感谢您的输入。添加此行开始导致错误'错误:找不到-ljson'。附:即使没有这条线,我可以从代码导航到指定的类型,它存储在'jansson.h'中,所以我想问题可能在其他地方 – HardLuck