1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DXLibAdvent Calendar 2020

Day 25

Android 上で Android Studio を使わずに C/C++ で Android アプリを開発してみる

Last updated at Posted at 2020-12-24

概要

Android 端末上に、Android ネイティブ向けのビルド環境を構築し、 Android ネイティブ向けのアプリを作成するまでの手順を、詳細を省いて説明します。

Termux での開発では、クロスコンパイルが困難であるため、ホストと同じアーキテクチャへの出力を行います。

今回は GUI ライブラリに DXライブラリ Android 版を使用しています。

手元の開発環境を GitHub にアップロードしています。適宜使ってください。

以下は少し前に、DXライブラリ Android 版を使ったアプリ開発 on Termux を試したものです。

検証環境

項目名
端末 Android Emulator Aquos Phone Sense6
OS Android 11 Android 12
CPU Architecture x86_64 arm64

Termux のインストール

Google Play または F-Droid1 から termux をインストールしてください。

必要なパッケージのインストール

pkg install curl build-essential aapt openssl-tool apksigner
# それと適当なテキストエディタ
pkg install vim

DXライブラリ Android版のダウンロードと解凍

curl -o DxLib.zip https://dxlib.xsrv.jp/DxLib/DxLib_Android3_22a.zip
unzip -oCP932 DxLib.zip

ソースファイルを書く

Android版の注意点 (Windows版にあってAndroid版にない関数、ファイルパッケージングの制約など) に気を付けながら適当に書いてください。

#include <DxLib.h>

int android_main() {
  if (DxLib_Init() == -1) {
    return 0;
  }

  while (ProcessMessage() == 0) {
    ClearDrawScreen();
    DrawBox(0, 0, 300, 300, GetColor(255, 0, 0), TRUE);
    ScreenFlip();
  }

  DxLib_End();
}

ビルドスクリプトの記述

依存ライブラリが非常に多いのと、ライブラリ同士の依存関係に注意が必要です。

clang -o libmain.so --shared --fPIC \
  Main.cpp \
  -I<DXライブラリへのパス>/<アーキテクチャ> \
  -L<DXライブラリへのパス>/<アーキテクチャ> \
  -landroid -lGLESv1_CM -lEGL -lstdc++ -lGLESv2 -lOpenSLES \
  -lm -lDxLib -lDxUseCLib -ljpeg -lpng -lzlib -ltiff \
  -ltheora_static -lvorbis_static -lvorbisfile_static -logg_static \
  -lbullet -lopus -llog -ldl
# TODO: CMakeFile を使いたい

AndroidManifest.xml の記述

知識がないので、android/ndk-samples をほぼそのまま使用

パッケージングスクリプトの記述

cp libmain.so lib/<アーキテクチャ>
cp $PREFIX/lib/libc++_shared.so lib/<アーキテクチャ>

aapt package -M AndroidManifest.xml -F app.apk -f
aapt add app.apk lib/<アーキテクチャ>/libmain.so
aapt add app.apk lib/<アーキテクチャ>/libc++_shared.so

APK 署名の準備

keytool が termux では使えそうにないので、OpenSSL を使って手動生成 しました。

openssl genrsa -3 -out key.pem 2048
openssl req -new -x509 -key key.pem -out key.x509.pem -days 10000 -subj '/'
openssl pkcs8 -in key.pem -topk8 -outform DER -out key.pk8 -nocrypt

APK への署名

apksigner sign --key key.pk8 --cert key.x509.pem app.apk

作った APK のインストール

手元の環境では、ファイルアプリから Termux が公開するストレージを開いて、それから .apk をタップしてインストールできました。
環境によっては、SDカードのダウンロードに移したり、提供元不明のアプリのインストールを許可したりする必要があると思われます。

TermuxInFile.png

あとがき

これが筆者のはじめての Android ネイティブアプリ作成であり、あちらこちらにバッドノウハウがちりばめられていると思います。
それと、手順が煩雑すぎるくせに、単一アーキテクチャにしか対応できないなど、どう考えても手軽とはいきません。

しかし、Android上でAndroidネイティブアプリを手軽に制作できる環境の潜在需要は、おそらく非常に大きいと考えている故、
私より強いAndroidエンジニアがこの記事を踏み台にしていくことを望んでいたりします。

  1. Android SDK 29 以降の SELinux の W^X ポリシーの強化と、Google Play が受け付けるアプリの最低 SDK バージョンの引き上げのため、Play Store 版の機能更新ができない状況になっています。詳細は Termux and Android 10 を確認してください。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?