从事Android开发已经有一段时间了,本身的开发IDE也从Eclipse转到了Android Studio。可是,需求上要求我把本身的Android Studio项目集成到一个Eclipse 下的ndk 项目上,在集成的过程当中,我有了一些值得分享的体验,在这里记录下来。android
在本身从事Android开发以前,本身作的是Cocos2dx-lua项目的开发工做。Cocos2dx-lua是一个跨平台的引擎,主要的游戏逻辑都是脚本,被当作资源放置在assets目录下。同时对于Android平台来讲,这个Cocos2dx-lua项目就是一个ndk项目,而且它的环境是在eclipse下的。而须要与之集成的Android项目则是一个Android Studio下的普通Android project。直接点说,我在这里作的就是在把咱们的Cocos2dx-lua的项目由Eclipse迁移到Android Studio底下。c++
(1)首先,咱们先用Cocos2dx-lua 的player 新建一个quick项目(我这里说的Cocos2d-x项目也就是quick-cocos2d-x 3.3版本),它会自动生成一些Android Eclipse项目。咱们选择其中的proj.android_no_anysdk项目来导入到咱们的Android Studio中。bash
(2)而后,打开proj.android_no_anysdk目录下的build_native.bat文件,编译咱们的引擎代码,生成供Android调用的so文件等须要与ndk部分作交互的文件。编译成功以后,咱们能够在Eclipse中导入咱们的项目,并将项目打包在手机上,咱们能够看见亲切的“Hello World”。
这个时候它是一个Eclipse项目,目录以下: app
(3)可是这样还仅仅是Eclipse项目,而使用Android Studio开发Android项目是大势所趋,因此后面要作的就是把项目转变为一个Android Studio项目。首先咱们打开Android Studio,选择File->New->Import Project,导入咱们刚才的proj.android_no_anysdk这个Eclipse项目。而后会有一连串的窗口,点击Next便可,它们会为咱们在一个新的目录建立一个全新的Android Studio项目,也就是Android Studio为咱们作的转化。
这个时候的项目目录是: eclipse
(4)这个时候项目报了一个错误,以下:ide
Error:(12, 0) Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration. <a href="openFile:F:\android\home_cocos\app\build.gradle">Open File</a>
这个错误的解决方式是:在咱们当前这个Android Studio项目的根目录下新建gradle.properties文件,其中的内容是android.useDeprecatedNdk=true 便可。这个时候同步咱们项目,而后点击Try Again,发现错误就已经消失了。gradle
(5)因为咱们的项目已经显示build successful了。咱们来尝试debug一下,看看能不能把项目经过Android Studio安装到手机上去。结果,运行发现了这个错误:ui
:app:compileDebugNdk FAILED
Error:Execution failed for task ':app:compileDebugNdk'. > NDK not configured. Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties. (On Windows, make sure you escape backslashes, e.g. C:\\ndk rather than C:\ndk) Information:BUILD FAILED
经过错误的log咱们能够看出,出现这个错误的缘由是咱们没有配置NDK的路径。
解决的方法是:
点击File->Project Structure打开窗口,以下图:lua
在红框内配置咱们的ndk目录便可。spa
(6)解决了上面的问题,咱们再执行一下debug,但愿编包在手机上面跑,以前的错误消失了,可是又有新的问题冒了出来。错误以下:
Error:F:\android\home_cocos\app\src\main\jni\hellolua\main.cpp:1:25: fatal error: AppDelegate.h: No such file or directory compilation terminated. make.exe: *** [F:\android\home_cocos\app\build\intermediates\ndk\debug\obj/local/armeabi-v7a/objs/cocos2dlua_shared/F_\android\home_cocos\app\src\main\jni\hellolua\main.o] Error 1 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 'F:\android-ndk-r9d\android-ndk-r9d\ndk-build.cmd'' 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. F:\android\home_cocos\app\src\main\jni\hellolua\main.cpp:1:25: fatal error: AppDelegate.h: No such file or directory :app:compileDebugNdk
这里显示没法找到咱们的某些c++文件,在这里delegate文件是咱们的一个入口文件,这里显示找不到,那么就没法把咱们的库文件和Android原生代码相关联,致使没法编包。
解决方法:
打开咱们当前目录下的build.gradle文件(不是整个项目的gradle文件),把以下代码
sourceSets.main { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] //disable automatic ndk-build call }
贴在咱们的gradle文件中,完整的build.gradle文件应该以下:
apply plugin: 'com.android.application' android { compileSdkVersion 19 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.ci123.jiayuanbao.home" minSdkVersion 9 targetSdkVersion 9 ndk { moduleName "cocos2dlua_shared" } sourceSets.main { jniLibs.srcDir 'src/main/libs' jni.srcDirs = [] //disable automatic ndk-build call } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } }
这个时候再点击bebug,发现咱们的cocos-lua项目能够完整地运行在咱们的手机上了!以下图:
其实我并无太多的ndk项目的开发经验,可是这个步骤是我本身一步一步测出来的,我以为能够绕过不少弯路,好比我用Eclipse生成的gradle导入到Andorid Studio中,死活找不到so库文件这样的问题。由于在这里没有本身的批处理文件,因此可能涉及到引擎的c++代码修改的话可能还要在Eclipse目录下操做,因此并非最优的方式。在这里记录一下也是为了方便本身查阅,若是有什么改进的意见,但愿能够告知我~