忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/23 12:05 】 |
既存のcocos2d-xプロジェクトをEclipseからAndroidStudioに移行する
cocos2d-xですでに作っているプロジェクトの
cocos2d-xのバージョンアップをするのは、少し手がかかる

特に、3.7より古いバージョンで作ったゲームを
3.7移行で対応されたandroid-studioに対応したい時はどうするのか。



通常、cocosプロジェクトのルートに
各プラットフォーム向けのディレクトリがある
proj.ios_mac
proj.android
などなど。
これらは、最初にプロジェクトを作る時に
$ cocos2d-x-3.7/setup.py
を実行することで作られる。
後からこれを実行することはできない(できるかもしれないがどうなるかわからない)


1.
cocos2d-x-3.7/templates/cpp-template-default/proj.android-studio/
ディレクトリを、自分のプロジェクトにまるっとコピー

2.
AndroidManifest.xmlを、
proj.android/からまるっとコピー

3.
とりあえずコンパイルしてみる
$ cd PROJ_DIR/proj.android-studio
$ cocos compile -p android --android-studio

エラーが出る。

No project name specified, using Activity name 'MainActivity'.
If you wish to change it, edit the first line of build.xml.




4.
build.gradleのapplicationIdがデフォルトのままなので
AndroidManifest.xmlのpackageと同じ名前に変更
ついでに、defaultConfig 関連の設定を全部proj.androidと同じに揃える(sdkVersionなど)

5.
再度コンパイル。
先ほどのエラーはなくなった

次のエラーは

jni/../../../Classes/BaseLayer.h:13:34: fatal error: extensions/cocos-ext.h: No such file or directory



cocos2d-xのライブラリのインクルード指定をする必要がある

6.
Android.mkのcocosライブラリインクルード周りを見てみる。
が、デフォルトでextension周りはインクルードされているようだ。

ついでなので、

CPP_FILES := $(shell find $(LOCAL_PATH)/../../../Classes -name *.cpp)
LOCAL_SRC_FILES := hellocpp/main.cpp
LOCAL_SRC_FILES += $(CPP_FILES:$(LOCAL_PATH)/%=%)

LOCAL_C_INCLUDES := $(shell find $(LOCAL_PATH)/../../../Classes -type d)



を記述。

またApplication.mkに

APP_CPPFLAGS += -DCC_TARGET_OS_ANDROID=1



を記述


7.
コンパイル。
まだ同じところでエラー。

8.
インクルードパスを指定するような場所を探す。
とりあえずProject StructureでNDKパスを以下に指定
/path/to/android/SDK/ndk-bundle
SDKは
/path/to/android/SDK
JDKは
/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home

しかしそのほかにインクルードパスを指定するようなところがない
インクルードパスを指定というより、
そのソースを含むlibcocos2dxライブラリの登録が必要なのか

9.
通常の手順で作られたcocos2dx用のandroid-studioプロジェクトには、libcocos2dxモジュールがプロジェクトビューに表示されている。
これは、
GAME_DIR/cocos2d/cocos/platform/android/libcocos2dx
ディレクトリである。
これを追加してみる。

cocos2d-x-3.7で作ったことのあるcocos2d-xプロジェクトから、
GAME_DIR/cocos2d/cocos/platform/androidディレクトリをまるっと上書きコピー

その上で、libcocos2dxを追加する


…と、ここまで来て
プロジェクトにモジュールを追加できなかった(追加するとき、libcocos2dxをプロジェクトとして追加してしまったようだ)
プロジェクト構成がおかしくなり、プロジェクトやディレクトリそのものを削除して再作成しても治らなくなった




そこで、結局新しいディレクトリでcocosプロジェクトごと新たに作ることにした
$ cocos new PROJ_NAME -p PACKAGE_NAME -l cpp

元のproj.androidから、新しいproj.android-studioにコピーするもの
Classes/
Resources/
proj.android/AndroidManifest.xml
proj.android/jni/
proj.android/app/src/
proj.android/libs/


ここまでコピーしたら、一度コンパイルしてみる
$ cocos compile -p android --android-studio


また、androidStudioだと、c++のスタティックライブラリにstring系が含まれていないので、
その対応も行う
参考


その他にやること

各種ライブラリをコピー

Analyticsに関して、
app_tracker.xml
EasyTrackerをAnalyticsApplicationに変更
など

PR
【2016/04/08 18:52 】 | cocos2d-x | 有り難いご意見(0)
androidでcocosのリリースモードを作成
一応、BuildVariantsで選択してから通常通りビルドできる



が、なぜか上手くいかない。
リリースビルドをSignedでないAPKで作成することになるので、エラーになる


リリースモードは、SignedAPKを作成するのが良い。



Signedについては、build.gradle内に記述できる。
Project Structureにも、Signedタブがある(同じ)


C++の部分については、jni/Application.mkに記述できる

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
APP_LDFLAGS := -latomic

APP_CPPFLAGS += -DCC_TARGET_OS_ANDROID=1

ifeq ($(NDK_DEBUG),1)
APP_CPPFLAGS += -DCOCOS2D_DEBUG=1
APP_CPPFLAGS += -DDEBUG=1
APP_CPPFLAGS += -DENABLE_TESTFLIGHT_DEBUG=1
APP_OPTIM := debug
else
APP_CPPFLAGS += -DNDEBUG
APP_OPTIM := release
endif



ここで、NDK_DEBUG の値は
build.gradleの

debug {
jniDebuggable true
}


で決まる。


なお、C++部分の定義なので、AndroidStudioからのビルドだけでなく、

$ cocos compile -p android --android-studio --ndk-mode release

が必要なことに注意

【2016/03/18 23:12 】 | cocos2d-x | 有り難いご意見(0)
cocos compileのコマンド
プロジェクト(正確にはソースディレクトリ)を指定する(-s)
$ cocos compile -s path/to/project -p android --android-studio

NDKをリリースモードでビルドする(--ndk-mode)
$ cocos compile -p android --android-studio --ndk-mode release

コンパイルをデバッグモードで行う(ログがたくさん出るのか?)(--debug)
$ cocos compile -p android --android-studio --debug

ヘルプ
$ cocos compile --help
(cocos --help ではない)
【2016/03/18 23:03 】 | cocos2d-x | 有り難いご意見(0)
adbコマンド
接続しているデバイスのログ出力
$ adb logcat

自分のゲームのログだけを出力
$ adb logcat | grep System

接続しているデバイスのファイラ
$ adb shell
$ run-as パッケージ名

接続しているデバイスにapkをインストール
$ adb install XXX.apk

接続しているデバイスのapkを削除
$adb uninstall xxx.xxx.xxx.packagename

Macに接続しているデバイスの情報を取得
$ adb devices

【2016/03/18 22:56 】 | Android | 有り難いご意見(0)
AndroidでJNIデバッグ
方法はある。
Qiita

Experimental Plugin というgradleの新プラグインを使う
公式

だが、gradleの書き方自体が変わったり、対応するgradleのバージョンが限られたりと
いろいろ制限付き。


ちょっとやってみたが、見たことないエラーが起きたので
一旦必要になるまで見送り。
バージョンもどんどん上がり、これらのページに書いてあるのとは状況が変わっている。

いつになったら正式に組み込まれるのか。
【2016/03/08 16:23 】 | Android | 有り難いご意見(0)
BuildVariants

参考ページ
build.gradleへの記述でビルドを分けられる。

Build Types
debug,releaseなどを指定できる
書き方例。上記ページから引用

android {
buildTypes {
debug {
packageNameSuffix ".debug"
}

inhouse.initWith(buildTypes.release)
inhouse {
packageNameSuffix ".inhouse"
}
}
}



Product Flavors
ビルドレベルではなく、機能の違いなどを指定できる
書き方例。上記ページから引用

android {

productFlavors {
/* 有料版 */
pro {
packageName "info.vividcode.android.app.pfsample.pro"
}

/* 無料版 */
free {
packageName "info.vividcode.android.app.pfsample.free"
}
}
}



C++のようにマクロはないので、ソースの切り替えは2種類用意する。
app/src/flavor1/
app/src/flavor2/
のように、build.gradle に書いたflavor名のディレクトリ以下に配置したら、それが使用されるということらしい。(まだ試していない)


Build TypesとProduct Flavorを合わせて Build Variants という。
どのBuild Variantsでビルドするかは、以下の場所で指定する。

結構気づきにくい
【2016/03/08 15:28 】 | Android | 有り難いご意見(0)
ProGuardまとめ
Android公式ドキュメント
Proguard公式ドキュメント2

ProGuardがやること
・不要なコードの削除
・変数名、クラス名を変更して、難読化する

・リリースモードでのみ動作
・特に何もせずとも処理されるようになっている

・build.gradleに設定記述あり


android {
...

buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}



minifyEnabled を true にすると、ProGuardが実行される

proguardFiles getDefaultProguardFile('proguard-android.txt'),
行は、proguardの詳細設定が描いてあるファイル名を指定。
ANDROID_SDK_ROOT/tools/proguard/ 以下のファイル名を指定する。
proguard-android.txt
の他に、最適化を含んだ設定ファイルとして
proguard-android-optimize.txt
というものも設定できるようだ。

ちなみに2つのファイルの差分は以下だけ

proguard-android.txt(最適化なし)

-dontoptimize
-dontpreverify



proguard-android-optimize.txt(最適化あり)

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify



多く書いてあるのは、メソッドを削除させないようにする設定。例えば

-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}


のようなもの。Javaコード上では使われていないが、xmlから呼び出すために必要なメソッド、のようなことらしい



さて、build.gradleの記述に戻る
'proguard-rules.pro'
と書いてある行があるが、これはプロジェクトディレクトリ内にあり、
プロジェクト固有の設定を書くファイル。(proはprojectのことのようだ)



また、ProGuard処理をすると、
build/outs/mapping.txt
というファイルが生成される。
これを使うと、難読化したスタックトレースを元に戻すことができる。
$ cd $ANDROID_SDK_ROOT/tools/proguard
$ retrace.bat -verbose mapping.txt obfuscated_trace.txt


さて、実際にやってみたところ、エラーが出た


調べると、結局proguard-rules.proに

-dontwarn
-ignorewarnings


と書けということになりそう。


詳しいページ
これ見ると、JNIだといろいろ設定がいるとのこと。
おそらく、javaコード内から呼び出されることのない、Native_***()系メソッドを全部keep指定する必要があるということだろう。

-keepclasseswithmembers class MainActivity {
public static ;
}


という感じか?(試していないので合っているかはわからない)


処理にもものすごい時間が掛かる。
しばらくやらなくていいかなという気がしてくる
【2016/03/08 15:11 】 | Android | 有り難いご意見(0)
cocos2d-x Androidで気づくバグ
・テクスチャの最大サイズは 2048x2048
なまじiOSだと動いちゃうので気づきにくい
D/cocos2d-x debug info: cocos2d: WARNING: Image (2984 x 2042) is bigger than the supported 2048 x 2048

【2016/02/29 17:47 】 | cocos2d-x | 有り難いご意見(0)
cocos2d-xでプラットフォームを判定
Xcodeだと、
CC_TARGET_OS_IPHONE
というマクロが定義されているので、これを使用するのが良い。

#if defined CC_TARGET_OS_IPHONE


Androidの場合、
app/jni/Application.mk
に以下を記述する
APP_CPPFLAGS += -DCC_TARGET_OS_ANDROID

すると、こう書けるようになる
#ifdef CC_TARGET_OS_ANDROID


まとめると、

#if defined CC_TARGET_OS_IPHONE
//ios
#elif defined CC_TARGET_OS_ANDROID
//android
#endif



となる。


マクロでなく実行中に判定したい時は

if (cocos2d::Application::getInstance()->getTargetPlatform() == cocos2d::Application::Platform::OS_ANDROID) {
}
else if (cocos2d::Application::getInstance()->getTargetPlatform() == cocos2d::Application::Platform::OS_IPHONE ||
cocos2d::Application::getInstance()->getTargetPlatform() == cocos2d::Application::Platform::OS_IPAD) {
}


という書き方もできる





以下、次善策


#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#endif

このような感じで書く。

気をつけないといけないのは、
#include "Cocos2d.h"
または
#include "cocos/platform/CCPlatformConfig.h"
をしていないファイルでこの記述を書いても正しく動作しないということ。

CC_TARGET_PLATFORMもCC_PLATFORM_IOSもどちらもundefinedだと、
等号自体は成り立ってしまうため

だから
#if defined(CC_TARGET_PLATFORM) && (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

というような書き方であるべき

【2016/02/29 14:59 】 | cocos2d-x | 有り難いご意見(0)
Androidでpushwoosh実装
Qiita
【2016/02/29 12:54 】 | Android | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>