PDIC for Android 開発メモ
一般ページはこちら
※ここに書いてあることはかなり古いので気にしない
リンク
JNI関数一覧
Android NDKで使えない関数一覧
AndroidStudioのテーマサンプル
Androidで動く携帯Javaアプリ作成入門
C++Builder XE7オンラインヘルプ
FMX-VCL-RTL ライブラリリファレンス
Blog/記事など
C++Builder関連
EXPERTGIGの社長ブログ
FAQ
Androidプログラム
- ListViewでSimpleAdapterを使った項目の追加・削除方法は?
- AssetManager.open()のパスは?
AndroidStudio
- AndroidStudio: Android Studioが常に最前面で使いにくい
→再起動してみては?
→再現条件をつかみ始めてきた: AndroidStudio上でショートカットキーによる他のアプリの起動(または最前面へ移動)すると、AndroidStudioはそれによるウィンドウの前後移動を認識せず、常に前に出ようとする(もぐらたたき的な)処理を入れているようです。今のところAndroidStudio再起動以外には復帰方法は見つかっていません。
- AndroidStudio: AMD用のHAXMなるものはあるのか?
→Genymotionを使う
- AndroidStudio: Emulatorを起動すると、"HAX is not working..."と出る
→AVD Manager→Virtual Deviceの設定→"Show Advanced Settings"→RAMの量を1536MB→1024MBに変更(HAXMのインストール時に指定したメモリ量)
- AndroidStudio: アンインストールしたときに設定情報も消したい
→C:/Users/.../.AndroidStudio以下を消すとよい
- AndroidStudio: 実機とUSB接続してデバッグしようとしたが、実行するときに接続したデバイスが出てこない
→"Google USB Driver"をSDK Managerからインストールする必要がある(XPERIAでは不要)
ではだめだった。
→Android StudioのTools - Edit Configurationsでtarget deviceを"USB"にする
それでもだめだ。
→デバイスマネージャーに接続しているデバイスがあるはず。その型番+"driver download"でググって見つかったドライバーをインストール
自分のXPERIAではこれでうまくいった
- Android StudioのEmulatorが遅すぎる(デバッグアプリの起動に時間がかかる)
→15秒程度であれば標準的。基本的にEmulatorはデバッグに使うべきものではない。
- "エラー: シンボルを見つけられません シンボル: クラスFragment"と出る。もちろんimportしているが。。
→今のところ不明(targetが違う?Ctrl+BでFragment classへジャンプできるしなぁ。。)
- "unexpected end of block data com.intellij.openapi.externalSystem.model.ExternalSystemException:
Cause: unexpected end of block data"というようなエラーが出る
→今のところ不明。某書籍のサンプルプロジェクトを利用としたら出てきてbuildができない
- clean buildは?
→通常のbuildコマンドにcleanを追加するだけ
→android.mkをtouchする
NDK
- L'ア' というような文字列定義で "converting to execution character set: Illegal
byte sequence" と出た。
→ソースファイルをUTF-8で保存する (-fexec-charset オプションで変更することもできるようだが・・・)
- GetMethodID()に必要なシグネチャを調べる方法は?
→コンパイルした.javaファイルに対して、javap -s -p xxx とする
- JNIからcallbackされて渡された文字列をSystem.out出力したら化けてしまう
→Java側での解決方法は未解決。C++側ならUTF16->UTF8変換することで正しく出力できた。
- JNIでNewStringするとき、引数に渡す文字列長を2倍にしないと正しくないのは?
→現在不明
C++Builder XE7
- C++BuilderXE7で"Internal compile error"が出た
→#errorに引っかかったかもしれない。それを探ってみるべし。またはプリコンパイルヘッダーを無効にしてみる
- CLOCKS_PER_SECは?@C++Builder
→1000000(clock()関数は1usec単位)
- Androidデバイスで実行/デバッグ開始できない
→出力フォルダをエディターなどでロックしていないか?(ファイルを開きっぱなしとか)
- C++Builderで付属ファイルの配布は?
→メニューより、プロジェクト - 配置 で設定できる。System::Ioutils::TPath::GetDocumentsPath()などでそのパスを取得。
- pthreadでrecursive mutexは使えないのか?
→PTHREAD_RECURSIVE_MUTEX_INITIALIZERは定義されているが、pthread_mutexattr_settype()でエラーが返ってくる。現在のところ相当するものを自作。
- RAD Studio(C++Builder)で実機デバッグ時のログ出力は?
__android_log_print()は使えるようだが、どこにも出てこない??現在はファイル出力してほかのAndroidアプリで表示している。(不便)
疑問
- C++Builderではログ出力はどうするのだ?
- pthreadでresursive mutexは使用できない?
Android Studioインストールメモ
- IntelCPUを使用している場合:HAXMがInstalledになっているようだが、実際はインストールされていないかも?Intel HAXMをインストールする。
Installしても"HAX is not working..."と出る場合は上記FAQを参考に。
- AMD CPUを使用している場合:Genymotion Plugins for Android Studio をインストールする
Android Studio vs C++Builder XE7
Android StudioとC++Builderの比較(AMD PhenomII X4 945での実測値)
|
Android Studio |
C++Builder XE7 |
Visual Studio 2015 |
アプリ起動時間
(実機) |
5秒 |
30秒 |
|
アプリ起動時間
(Emulator) |
15秒 |
1秒(Win64) |
|
GUI設計 |
基本XML入力で実行時にGUI確認 |
マウス+keyboardでビジュアル編集 |
|
言語 |
Java |
C++ |
|
対応CPU |
全CPU |
ARMのみ |
|
Package Size
(空アプリ) |
7MB: apkサイズ
21MB:.soファイル |
200KB: dynamic link
14MB: static link) |
|
開発環境のサイズ |
7GB |
25GBくらい?(AndroidとWindowsのみ、database、helpなど外して必要最小限に設定) |
|
PDICを開発する場合 |
Java+JNIが必須
デバッグ難易度が上がる |
|
|
PDIC移植の開発時間 |
1〜2年程度? |
1年程度? |
|
その他 |
|
Android上で逆アセンブルデバッグができる |
|
C++Builder XE7の評価
C++Builder XE7 お試し版にて
・インストールに必要なHDD ・・・ OSX, iOS, CORBAを外して10GB以上(正確には測っていない)
・空のAndroidアプリ起動まで30秒
・空のWin64アプリ起動まで1秒
・Android上で実行中ブレークし、逆アセンブルでステップ実行ができる
・package size - Win64版=200KB(RTL/DLLあり)、Android版=7MB
→apkファイルの中身を見ると、アプリバイナリファイル(.so)だけで21MB
→Win64をstatic linkにしたら14MB
問題点
・実行ファイルがでかい。仕方ないが、独自コードを追加しても最終的にサイズはそれほど大きくならないだろう。
・ネット上でC++Builder XEを使っている人をほとんど見かけない=Google先生に頼れない
・付属のヘルプは使い物にならない?
昔から(C++Builder5から)変わらない問題点
・エディターの支援機能が遅くて使い物にならない
・エディターの機能は昔と変わらず、今となっては貧弱
・コンパイルのスレッドは1つしか使っていない
・たまに"Internal compiler error"が出る
・コンパイルを開始したらIDEが落ちることがたまにある
悪くなったところ
・コンパイルでエラーが発生しても発生箇所に自動的にジャンプしない
・プリコンパイルヘッダの保存先が指定できない
Android Studioの困ったところ
C++Builder XE7の困ったところ
- u8"日本語"は使えるのに、実際はSJIS(ANSI)で埋め込まれる(なんじゃそりゃ)
- #errorがあると"Internal compile error"と出てしまう。これだけではエラーの箇所がわからない
- 「コンパイルの終了時に自動的に閉じる」をチェックしても閉じない
- エディターの支援機能(補完機能)がタコ。入力が速いと余計な括弧やらができてしまう。使い物にならん。
- header fileのdebug breakができない?(そんなタコdebuggerになったのか?)
- 実機で実行開始中にF5(break point設定)を行うとはまる(ログオフが必要)
ソースコードFAQ
UnicodeStringの定義場所 - include/android/rtl/ustring.h
NDKインストールメモ
NDK開発に必要なもの: Android NDK, cygwin
cygwinインストール時に必要なパッケージ: gcc-core, g++, make
Android StudioでJNI開発する方法 @Android Studio 1.1.0/Windows
こちらがソース。
- local.propertiesにndk.dir=によるNDKへのパス指定 (ex.
K:\wbin\android-ndk-r10d
)
- JNIのソースコードはapp/src/main/jniに置く(AndroidStudio上でも自動的に認識する)
- app/build.gradleに ndk { moduleName "moduleNameHere" } を追加。(正確な追加方法は他のサイトにて)
- ここでAndroidStudioのbuildを実行。(エラーが発生するが無視)
- app/build/interemediates/ndk/debug/Android.mkのLOCAL_SRC_FILESのパス指定を
\
→ / に変更 ←Windows固有
- ここでndk-buildを実行
<NDK_DIR>ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=<PROJ_DIR>\app\build\intermediates\ndk\debug\Android.mk
APP_PLATFORM=android-21 NDK_OUT=<PROJ_DIR>\app\build\intermediates\ndk\debug\obj
NDK_LIBS_OUT=<PROJ_DIR>\app\build\intermediates\ndk\debug\lib APP_STL=gnustl_shared
APP_ABI=armeabi,mips,armeabi-v7a,x86
←Windows固有
- app/build/intermediates/ndk/debug/lib以下をapp/src/main/libs以下にコピー ←Windows固有
- app/build.gradle に sourceSets { main { jni.srcDirs = [] } } を追加
- AndroidStudioでアプリを実行
- C側のファイル構成が変わったとき・・・8. をコメントアウトして「実行」を行い、4からやり直す。というのもありだが、手動でLOCAL_SRC_FILESに必要なファイルを一つずつ追加していく。
- C側のファイルの内容のみが変わったとき・・・6と7を行う
これを簡単化するために作ったMakefile。それぞれのプロジェクトのrootに置く。
build:
ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=.\app\build\intermediates\ndk\debug\Android.mk
APP_PLATFORM=android-21 NDK_OUT=.\app\build\intermediates\ndk\debug\obj
NDK_LIBS_OUT=.\app\build\intermediates\ndk\debug\lib APP_STL=gnustl_shared
APP_ABI=armeabi,mips,armeabi-v7a,x86
copy app\build\intermediates\ndk\debug\lib\armeabi\*.so app\src\main\libs
※注意事項
・clean buildするとandroid.mkファイルが消される(らしい)ため、clean build時はjni関連のファイルのbackupをとっておくこと!!
TODO
・JNI - 最終的にはRegisterNatives()で高速化したほうがいい?→Androidはandroid\serversのregister_android_server_xxx()がある。
開発日記
→別ページへ
連絡先: