I’ve been working on Cocos2d-X 3.x all of 2016. And boy, it’s a doozy! It’s great when it works and other times I am slapping Google like a piece of analog hardware - tap, tap, tap - are you working?!
It all started with the easiest of setups.
cocos new -p com.shipatwarp.game AwesomeInfinite
That set me up nicely with project.ios_mac
and project.android
for iOS and Android respectively.
Xcode compiled the game and brought it up on the simulator super smooth. For Android, project.android
is actually an Eclipse based layout with ant
build system. It then requires setting up the Google Play Services Library
as a library project which is essentially a relative instead of absolute path. Which on a good day is maybe and on on a bad day - never. Anyhow, I carried on since it gave an APK that I could adb install
. Days were happy in the Shire.
Then came the big day! Beta testing wrapped up. No crashes! Built an IAP and pushed to iTunes Connect. Wait for Apple approval. Built an APK and pushed to Android Console. And wait-a-minute! Did I read that right?! Google rejected the APK because of OpenSSL 1.01l
compiled in somewhere. Anything less than 1.02f/1.01r
carries a Logjam man-in-the-middle attack vulnerability. I didn’t make that up. Read it here.
What’s wrong with the Eclipse based android.project
build you ask? Everything. Atleast everything now. Google moved the Android toolchain to Android Studio and Gradle. So if you’re needing latest support libs even for Google Analytics, then you have to use Android Studio. Cocos2d-x 3.9 didn’t support Android Studio very well, certainly not the latest android-ndk-r13b
. I found out that aws-cpp-sdk
was using the older version, so had to upgrade and compile against r13b
. That meant that upgrading cocos version to 3.13.1, upgrading the NDK, upgrading all libs. Just upgrading. Ladies and Gentlemen, welcome to
hell.
Much reading revealed following:
- The
cocos
command has anproject.android-studio
. - The
cocos compile
usesndk-build
system which means thejni/Android.mk
andjni/Application.mk
are back in action. - Setting up NDK build from within Android Studio to generate
libcocos2dcpp.so
is not easy. It wants to useCMake
and which means portingAndroid.mk
setup to the gradle task. I’m not sure what it means forApplication.mk
. For JNI/NDK builds,ndk-build
option is also available but I didn’t go that route as what I did next worked.
This is the strategy I came up with:
- Download latest of everything
- Use Android Studio to setup the SDK packages, tools, NDK etc. Follow the steps here until NDK setup.
- Setup vars required by Cocos2d-X ie run
setup.py
. - Now comes the hacker behavior ie break out the duct tape roll:
- Create a new cocos project with same package name. We will be working with the
project.android-studio
directory. - Run Android Studio build from command line to make sure the hello world sources compile. The APK would work too. Here’s the command:
cocos compile -p android --android-studio -m debug
- Copy the
project.android-studio
to the original project’s root dir, replacing the one there. - Copy
project.android/jni/Android.mk
intoproject.android-studio/app/jni/Android.mk
. Edit the paths in the latter to update to correct relative path eg../../../Classes
. - Copy
project.android/jni/Application.mk
intoproject.android-studio/app/jni/Application.mk
. I didn’t have to mess with this one. YMMV. - Since we don’t have the Eclipse based library reference project anymore, what do we do? What do we do in gradle, kids? Bingo! add a line to dependencies in
app/build.gradle
. Much cleaner than relative paths. Here’s mine:compile 'com.google.android.gms:play-services-analytics:10.0.1'
.
- Create a new cocos project with same package name. We will be working with the
That’s it!
The nice thing is that I future proofed my Android builds since Google Play Services, AppCompat, Support Library are pretty much supported on the Gradle build system. Please feel free to drop me a line. And check out my game!
Note to self: build a shortcode to display app store badges.