DXライブラリとは
- 筆者はイラストに動きをつけるアニメーションソフト 9VAeきゅうべえを C言語で開発している。アンドロイドアプリをつくるのに、DXライブラリを使っている。
- DXライブラリはもともと、Windows用描画ライブラリだったため、最初の開発環境は、Visual Studio だったが、現在は、Android Studio もサポートされている。
- Androidストアが、2021年8月から、APKファイルでの新規アプリ登録を認めなくなるため、今後は、Android Studio で作成しなければならない。
- ここは、Visual Studio プロジェクトから、Android Studio に移行したときの記録です。こちらのほうが新しい記事です
DXライブラリのよいところ
- 膨大な C 言語の資産がそのまま使える。
- 現在もサポートされており、日本語で質問に答えてくれる。入手先はこちら。
- 同種のライブラリに、Cocos2dX があるが、ビルドに大幅な時間がかかり、さらに、Android Studio のバージョン違いにより、結局ビルドできなかった。
Visual Studio からの移行
gradle にソースを追加
- DXライブラリに付属の AndroidStudio サンプルをビルドし、実機デバッグできるように開発環境をととのえる。AndroidStudioを実行してサンプルプロジェクトをインポートすると、自動的にいろいろ設定してくれる。
- gradle の構造が複雑で最初はわかりにくい。
- プロジェクトに自分のファイルを追加するには、app/src/main/cpp/CMakeLists.txt にソースの相対パス(CMakeLists.txtからの)を記述する。gradle がこの情報をもとに依存関係を調べて、makefileを自動作成してくれるようだ。
- ちなみに、サンプルの「プロジェクトに追加すべきファイル_android用」フォルダを「dxlib」という名前に変更したときは、ここを以下のように、include_directories と link_directories を書き換える。
app/src/main/cpp/CMakeLists.txtの一部
include_directories( ../../../dxlib/${ANDROID_ABI} )
link_directories( ../../../dxlib/${ANDROID_ABI} )
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp
ここに自分のソースファイルを相対パスで追加する
)
コンパイルオプションの設定
- C のコンパイルができなかった。
- DXライブラリのインクルードファイルはC++の文法で記述されている。デフォルト値の記述、同じ関数名で引数の違うものが存在など。
- VisualStudioでは、これを、C にインクルードしてもエラーがでなかったが、Android Studio ではエラーがでる。これは、app/build.gradle の中の cppFlags にコンパイルオプション"-std=c++11"を追加すればエラーが出なくなった。また、#ifdef TEST を有効にするには、以下のように、arguments をつけるとよいらしい。
app/build.gradleの一部
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments "-DTEST"
}
}
アイコンの作成
app/src/main/AndroidManifest.xmlの一部
<application
...
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher"
...
Android 11 対応
-
上の private boolean checkPermission() 関数、private void requestPermission() 関数を、最初に起動する Java(JNI) の中にいれ、権限がなければ取得するようにする。このコードは、SDK が API30(Android 11)でないとビルドできない。
app/build.gradleの一部
android {
compileSdkVersion 30
defaultConfig {
minSdkVersion 21
targetSdkVersion 30
}
API21 からサポートするには
以下のオプションが必要
app/build.gradleの一部
android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
WebViewAssetLoader を使うには
以下の追加が必要
app/build.gradleの一部
dependencies {
implementation 'androidx.webkit:webkit:1.2.0'
}
これを追加すれば、以下の importが使える
import androidx.webkit.WebViewAssetLoader;
- gradle.build の compileSdkVersion 30 で未定義ビルドエラーが出た場合、importに適切なモジュールが記載されていないのが原因。未定義エラーが出た文字列の先頭にカーソルを移動させれば、どのモジュールの定義か候補が出るので、それらしいものを吹き出しから選択。するとimport追加するか吹き出しが出るので、import追加する。ファイルの先頭のimportを開かなくても修正できた。すばらしい!
KeyStore の付け方
- アプリのリリース バージョンをビルドして署名
- Android Studio > [Build] > [Generate Signed Bundle/APK]
- [Android App Bundle]
- Keystoreのパスやパスワードを設定
- release
これで、app/release フォルダに、app-release.aab というAppBundleができた。
Androidストアへの登録
Gooogle Play Console
「アプリを作成」ボタン
- 「アプリを作成」ボタンをクリック
- アプリ名:9VALきゅうべえラーニング
- デフォルトの言語:日本語
- アプリ/ゲーム:アプリ
- 無料/有料:無料
- 「アプリを作成」ボタンをクリック
今すぐテストを開始
- テスターを選択する:自分を登録
- 新しいリリースを作成
- 内部テスト版リリースの作成
- Play App Signing
- Android Studio で release 署名した aab ファイルをアップロード
「「android.permission.MANAGE_EXTERNAL_STORAGE」権限をリクエストしていますが、Google Play ではまだサポートされていません。」というエラーになった。
・「android.permission.MANAGE_EXTERNAL_STORAGE」権限
9VAeの場合、動画作成のため数千の連番画像を保管する場所を、自分のフォルダに作成したい。ひとまず API29 に下げてアップロードしてみる。
Chromebook での動作
- Androidスマホで動作していたアプリが、Chromebook だとファイル読み書きができなくなった。AndroidStudio で開発すると、読み書きできるみたいだ(ラーニング)
- target は、API21-29 として、API29でビルドすると、Androidでは保存できるが、Chromebookでは保存できなかった。以下のどれが効いているのかわからないが、次の設定にすると保存できている
- ターゲットは、API21-29、ビルドは API30 にする
- インターネットアクセス権限を追加
- ファイルアクセスは、legacy、ターゲットを29にしておく。
jcenter の廃止
- AndroidStudioから、jcenter が使えなくなるのではずすよういわれた。 jcenter を mavenCentral()に変更するとよいみたい。
buildscript {
repositories {
google()
//jcenter() <--削除
mavenCentral() //<--こちらに変更
}