将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