ラベル android の投稿を表示しています。 すべての投稿を表示
ラベル android の投稿を表示しています。 すべての投稿を表示

2017年5月1日月曜日

cocos2d-x JNI(Java) の に関する覚書

調べたりした結果をずらずらと並べます

cocos2d-x 3.x系 android studioでのJNI headerの作成

cd proj.android-studio

 javah -classpath "app/build/intermediates/classes/debug/:../cocos2d/cocos/platform/android/libcocos2dx/build/intermediates/classes/debug:$ANDROID_SDK_ROOT/platforms/android-23/android.jar" -d "app/jni/NativeBridge" org.cocos2dx.cpp.AppActivity

#android-sdkのバージョンは環境に合わせてください
#一度ビルドする
#app/jni/NativeBridgeにheaderファイルが作成されます


SDKBOX Admobプラグインの位置修正

Admobプラグインは位置が上下左右固定なのでマージンを指定したい場合
次のようなコードで変更できてる模様 
 
ViewGroup rootView = AppActivity.getRootView(context);
if(rootView != null)
{
    for (int i = 0; i < rootView.getChildCount(); i++) {

        ViewGroup view = (ViewGroup)rootView.getChildAt(i);

        for (int j = 0; j < view.getChildCount(); j++ ) {
            if (view.getChildAt(j) instanceof AdView) {
                View child = view.getChildAt(j);
                int height = child.getBottom() - child.getTop();

                ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) child.getLayoutParams();
                lp.bottomMargin = 60 * height / 50;
                child.setLayoutParams(lp);
            }
        }

    }
}


追記予定...

2017年4月29日土曜日

cocos2d-x <- android UIスレッドからの値の取得

cocos2d-xなどでAndroidのUIスレッドから値を直接取得したいという場合
例えば、 クリップボードから取得する場合とか
runOnUiThreadから処理したのちにcallbackを呼ぶ 必要があります

大変面倒なのでwaitを使ってブロッキング処理をしてみましょう
ということでBlockingOnUIRunnableを少し改良してGeneric型を返すようにしてみました


BlockingOnUIRunnable.java

 
/**
 * Blocking Runnable executing on UI thread
 *
 * @author
 *
 */
public class BlockingOnUIRunnable<t>
{
    // Activity
    private Activity activity;

    // Event Listener
    private BlockingOnUIRunnableListener<t> listener;

    // UI runnable
    private Runnable uiRunnable;

    public T retValue;

    /**
     * Class initialization
     * @param activity Activity
     * @param listener Event listener
     */
    public BlockingOnUIRunnable( Activity activity, BlockingOnUIRunnableListener<t> listener )
    {
        this.activity = activity;
        this.listener = listener;

        uiRunnable = new Runnable()
        {
            public void run()
            {
                // Execute custom code
                if ( BlockingOnUIRunnable.this.listener != null ) {
                    retValue = BlockingOnUIRunnable.this.listener.onRunOnUIThread();
                }

                synchronized ( this )
                {
                    this.notify();
                }
            }
        };
    }


    /**
     * Start runnable on UI thread and wait until finished
     */
    public void startOnUiAndWait()
    {
        synchronized ( uiRunnable )
        {
            // Execute code on UI thread
            activity.runOnUiThread( uiRunnable );

            // Wait until runnable finished
            try
            {
                uiRunnable.wait();
            }
            catch ( InterruptedException e )
            {
                e.printStackTrace();
            }
        }
    }

}
 
 
 

BlockingOnUIRunnableListener.java

 
/**
 * Events for blocking runnable executing on UI thread
 *
 * @author
 *
 */
public interface BlockingOnUIRunnableListener<t>
{

    /**
     * Code to execute on UI thread
     */
    public T onRunOnUIThread();
}


使い方 


BlockingOnUIRunnable<String> actionRunnable 
  = new BlockingOnUIRunnable<String>( {{context}}, new BlockingOnUIRunnableListener()
{
    public String onRunOnUIThread()
    {
        ClipboardManager clipboard = (ClipboardManager) {{context}}.getSystemService(Context.CLIPBOARD_SERVICE);
        if (clipboard.hasPrimaryClip()) {
            ClipData data = clipboard.getPrimaryClip();
            ClipDescription description = clipboard.getPrimaryClipDescription();
            if (data != null && description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
                return String.valueOf(data.getItemAt(0).getText());
        }
        
        return "";
    }
} );

actionRunnable.startOnUiAndWait();
return actionRunnable.retValue;
 
 
 
{{context}}はActivityのcontext, Cocos2dxActivity.getContext()等から取得する値 startOnUiAndWait()で処理を待って retValueから戻り値を取得します
wait中はGLThreadが停止するので重たい処理には使えません

2014年1月17日金曜日

Android NDKビルド環境をUbuntu Serverに作ってみた

AndroidのNDKビルド用の環境はWindowsやMac上でも作れるのですが、
Windowsだとcygwinとか面倒くさいし
Macだとたまにldtoolがないとか怒られるので
VMWare上のUbuntuに作成することにしました。
これだとコピペで環境を保存したり増やしたりえきるので便利ですね。


VMWare上にすでにUbuntuがインストールされていることが前提です。
Serverなのは消費メモリが少ないとかリソースの問題です。

Build環境
sudo apt-get install build-essential

1.Javaのインストール

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get install oracle-java7-installer 
 
 

2. Android NDKインストール

 
Android NDKをダウンロードします 

tar -xvjof android-ndk-r9c-linux-x86_64.tar.bz2
sudo mv ./android-ndk-r9c /usr/local/
echo 'export PATH=$PATH:/usr/local/android-ndk-r9c' >> .bashrc 
echo 'export NDKROOT=/usr/local/android-ndk-r9c' >> .bashrc 
 
 


3. Android SDK インストール

 
Android SDKをダウンロードします
unzip adt-bundle-linux-x86_64-20131030.zip
sudo mv adt-bundle-linux-x86_64-20131030 /usr/local/

echo 'export PATH=$PATH:/usr/local/adt-bundle-linux-x86_64-20131030/sdk/tools' >> .bashrc 
echo 'export PATH=$PATH:/usr/local/adt-bundle-linux-x86_64-20131030/sdk/platform-tools' >> .bashrc 
 


ライセンス許可

Android SDKの実行には最初にライセンスの認証が必要です
 
cd /usr/local/adt-bundle-linux-x86_64-20131030/sdk/tools
echo "y" | ./android update sdk --no-ui


 

SDK一覧

次のコマンドでSDKの一覧が表示されます
./android list sdk

 

SDKアップデート

必要なSDKをインストール、アップデートします
android update sdk -u --filter platform-tools,android-16,android-8,extra-android-support

 
 
動かしてみる
ndk-buildを実行してみる 
 
 

4.ビルドする際のメモ

 
個人的にAndroid.mkを利用するよりも
Configure時にSysroot, CC, CFLAG, LD, AR等を指定して
クロスコンパイルするほうがiOSと同じ要領なので楽

lib作成時にだいたいは次のようにして、static libraryを作って
あとで、static libraryを参照するAndroid.mkでsoにします
 
build.sh :  
 
BINPATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin
export CROSS_COMPILE=$BINPATH/arm-linux-androideabi
export CC=${CROSS_COMPILE}-gcc
export CXX=${CROSS_COMPILE}-g++
export LD=${CROSS_COMPILE}-ld
export AR=${CROSS_COMPILE}-ar
export CFLAGS="--sysroot $SYSROOT -std=gnu99 -L$LIB_DIR -L${NDK_ROOT}/usr/lib -I${NDK_ROOT}/usr/include"
 
./configure --prefix="一時フォルダ" --enable-static --disable-shared --host=arm-linux-androideabi

 
 
※おそらくConfigure時にarm-linux-androideabiの定義がないと怒られるので
下のリンクからconfigure.guess, configure.subをダウンロードして
configureのあるフォルダに移動、上書きします 
http://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/config.guess
http://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/config.sub


 
Android.mk : 
この辺りが参考になるかと 
https://groups.google.com/forum/#!topic/android-group-japan/NMoJAioGi04