DXライブラリ＋Android Studioでストアアプリを作る方法

# DXライブラリとは

- 筆者はイラストに動きをつける[アニメーションソフト 9VAeきゅうべえ](https://qiita.com/danjiro/items/253e5a33a38599098274)を C言語で開発している。アンドロイドアプリをつくるのに、DXライブラリを使っている。
- DXライブラリはもともと、Windows用描画ライブラリだったため、最初の開発環境は、Visual Studio だったが、現在は、Android Studio もサポートされている。
- Androidストアが、2021年８月から、APKファイルでの新規アプリ登録を認めなくなるため、今後は、Android Studio で作成しなければならない。
- ここは、Visual Studio プロジェクトから、Android Studio に移行したときの記録です。[<b>こちらのほうが新しい記事です</b>](https://qiita.com/danjiro/items/7c7fae8bc8db916b3818)

# 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 を書き換える。


```txt: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 をつけるとよいらしい。


```gradle:app/build.gradleの一部
    externalNativeBuild {
       cmake {
          cppFlags "-std=c++11"
          arguments "-DTEST"
       }
    }
```

## アイコンの作成

- [image asset studio](https://developer.android.com/studio/write/image-asset-studio?hl=ja#create-adaptive)

```xml:app/src/main/AndroidManifest.xmlの一部
   <application
        ...
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher"
        ...
```


# Android 11 対応

- [ファイルアクセス権限の取得](https://stackoverflow.com/questions/62782648/android-11-scoped-storage-permissions)

- 上の　private boolean checkPermission()　関数、private void requestPermission()　関数を、最初に起動する　Java(JNI) の中にいれ、権限がなければ取得するようにする。このコードは、SDK が API30(Android 11)でないとビルドできない。

```gradle:app/build.gradleの一部
android {
    compileSdkVersion 30

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 30
    }
```

## API21 からサポートするには

以下のオプションが必要

```gradle:app/build.gradleの一部
android {
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
```

## WebViewAssetLoader を使うには

以下の追加が必要

```gradle:app/build.gradleの一部
dependencies {
    implementation 'androidx.webkit:webkit:1.2.0'
}
```

これを追加すれば、以下の importが使える

```java
import androidx.webkit.WebViewAssetLoader;
```



- gradle.build の　compileSdkVersion 30 で未定義ビルドエラーが出た場合、importに適切なモジュールが記載されていないのが原因。未定義エラーが出た文字列の先頭にカーソルを移動させれば、どのモジュールの定義か候補が出るので、それらしいものを吹き出しから選択。するとimport追加するか吹き出しが出るので、import追加する。ファイルの先頭のimportを開かなくても修正できた。すばらしい！


# KeyStore の付け方

- [アプリのリリース バージョンをビルドして署名](https://developer.android.com/studio/publish/app-signing?hl=ja#sign-apk)
- Android Studio > [Build] > [Generate Signed Bundle/APK] 
- [Android App Bundle] 
- Keystoreのパスやパスワードを設定
- release

これで、app/release フォルダに、app-release.aab というAppBundleができた。

# Androidストアへの登録

## Gooogle Play Console

- [Gooogle Play Console ヘルプ](https://support.google.com/googleplay/android-developer/answer/9859152?hl=ja)
- [AndroidStudi からアプリ登録](https://developer.android.com/studio/publish/upload-bundle?hl=ja)

### 「アプリを作成」ボタン

- 「アプリを作成」ボタンをクリック
- アプリ名：9VALきゅうべえラーニング
- デフォルトの言語：日本語
- アプリ／ゲーム：アプリ
- 無料／有料：無料
- 「アプリを作成」ボタンをクリック

### 今すぐテストを開始

- テスターを選択する：自分を登録
- 新しいリリースを作成
- 内部テスト版リリースの作成
- Play App Signing
- Android Studio で　release 署名した aab ファイルをアップロード

「「android.permission.MANAGE_EXTERNAL_STORAGE」権限をリクエストしていますが、Google Play ではまだサポートされていません。」というエラーになった。

・[「android.permission.MANAGE_EXTERNAL_STORAGE」権限](https://support.google.com/googleplay/android-developer/answer/9956427?hl=ja)
- [StorageProvider Sample](https://github.com/android/storage-samples/tree/master/StorageProvider)
 - [MediaStore の使い方](https://developer.android.com/training/data-storage/shared/media)
 - [MediaStore Sample](https://github.com/android/storage-samples/tree/master/MediaStore)

9VAeの場合、動画作成のため数千の連番画像を保管する場所を、自分のフォルダに作成したい。ひとまず API29 に下げてアップロードしてみる。


# Chromebook での動作

- Androidスマホで動作していたアプリが、Chromebook だとファイル読み書きができなくなった。AndroidStudio で開発すると、読み書きできるみたいだ（ラーニング）
- target は、API21-29 として、API29でビルドすると、Androidでは保存できるが、Chromebookでは保存できなかった。以下のどれが効いているのかわからないが、次の設定にすると保存できている
- ターゲットは、API21-29、ビルドは API30 にする
- インターネットアクセス権限を追加
- ファイルアクセスは、legacy、ターゲットを29にしておく。

# jcenter の廃止

- AndroidStudioから、jcenter が使えなくなるのではずすよういわれた。 jcenter を mavenCentral()に変更するとよいみたい。

```gradle
buildscript {
    repositories {
        google()
        //jcenter() <--削除
        mavenCentral() //<--こちらに変更
    }
```