gradle编译ndk失败

将Eclipse Project移到Android Studio中,遇到很多问题。


问题1:我的Application.mk中申明了只编译ARM 32位,移过去却发现在编译ARM 64,于是Fail.

/home/yanchen/StudioSpace/RemoteControll-sansang/app/src/main/jni/sqlite/sqlite3.c:90644:29: note: in expansion of macro 'SQLITE_INT_TO_PTR'
                             SQLITE_INT_TO_PTR(n), P4_INT32);
                             ^
/home/yanchen/StudioSpace/RemoteControll-sansang/app/src/main/jni/libpng/contrib/pngminus/png2pnm.c:43:17: fatal error: png.h: <span style="color:#FF0000;">No such file or directory
 #include "png.h"</span>
                 ^
compilation terminated.
make: *** [/home/yanchen/StudioSpace/RemoteControll-sansang/app/build/intermediates/ndk/debug/obj/local/<span style="color:#FF0000;">arm64-v8a</span>/objs/rc//home/yanchen/StudioSpace/RemoteControll-sansang/app/src/main/jni/libpng/contrib/pngminus/png2pnm.o] Error 1

:app:compileDebugNdk FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/home/yanchen/Dev/android-ndk-r10e/ndk-build'' finished with non-zero exit value 2

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

后来找到一篇不错的文章,究其原因,是因为Gradle在编译时,会自己创建一个mk file,而忽略掉你写的所有Android.mk.

http://ph0b.com/android-studio-gradle-and-ndk-integration/

而我的project中,模块比较多,这真的好吗?


于是在app/build.gradle中加入如下代码:

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
    ......
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
        jni.srcDirs = [] //disable automatic ndk-build call
    }

    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main/jni').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
        }
    }
 
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
<pre name="code" class="html">./gradlew  clean build

 

这样就关闭了gradle的自动编译NDK,并且通过自己调用ndk-build来编译,也就会使用自己的Android.mk了。

以为到此就结束了,然并卵...........

继续编译:

./gradlew  clean build

出错如下:

[armeabi] Compile++ thumb: rc <= NqRemoteDesktop.cpp
In file included from jni/remotecontroll/NqRemoteDesktop.cpp:5:0:
jni/remotecontroll/../sansungremote/RemoteDesktop.h:37:26: fatal error: android/rect.h: No such file or directory
<span style="color:#FF0000;"><strong> #include <android/rect.h></strong></span>
                          ^
compilation terminated.
make: *** [obj/local/armeabi/objs/rc/NqRemoteDesktop.o] Error 1

几经排除测试,发现ndk-build会依赖project.properties文件,

于是在app/src/main目录下加入这个文件。



再继续编译...终于成功!

:app:testArmDebug
:app:preCompileArmReleaseUnitTestJava
:app:preArmReleaseUnitTestBuild UP-TO-DATE
:app:prepareArmReleaseUnitTestDependencies
:app:processArmReleaseUnitTestJavaRes UP-TO-DATE
:app:compileArmReleaseUnitTestJava UP-TO-DATE
:app:compileArmReleaseUnitTestSources UP-TO-DATE
:app:assembleArmReleaseUnitTest
:app:testArmRelease
:app:test
:app:check
:app:build

BUILD SUCCESSFUL



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值