検索
AND検索
OR検索
トップ
|
リロード
|
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
OS関係/Android/NativeActivity をテンプレートにして作成
2023.4 (read)
[
]
日
月
火
水
木
金
土
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
AjaxTree
Top
(293)
3D-Graphics
(8)
Help
(15)
PukiWiki
(10)
WEBサービス
(7)
その他
(18)
クラウド
(2)
コンピュータ言語
(19)
サーバー関係
(35)
セキュリティ
(11)
ディスクとファイル共有
(8)
デザイン系
(10)
データベース
(9)
パソコン・機材
(6)
仮想化技術
(4)
情報共有
(14)
教育
(2)
文章ツール
(1)
映像・サウンド
(11)
生活品質
(20)
開発環境
(15)
OS関係
(42)
最新の20件
2022-10-26
OS関係/Linux/AlmaLinux
OS関係/MacOSX/Ventura
2021-12-07
クラウド/Kubernetes
クラウド/サービスメッシュ
2021-12-06
クラウド
2021-06-24
OS関係/MacOSX
2020-09-01
OS関係/Linux/サーバの初期設定
2020-05-24
サーバー関係/ルータ
2020-04-30
WEBサービス/Amazon Cloud(AWS)
2020-04-16
サーバー関係/Mail/Dovecot
サーバー関係/Mail/Postfix
2020-03-25
OS関係/MacOSX/Catalina
2020-03-12
OS関係/Linux/Alpine
2020-03-11
サーバー関係/DNS/Unbound
パソコン・機材/Yamaha_RX830
RecentDeleted
サーバー関係/AppServer
サーバー関係/WEB
サーバー関係/Mail
サーバー関係/デーモン登録
MenuBar Edit
Total:0/Today:0
開始行:
#contents
*NativeActivityとは? [#k07c122b]
NativeActivityとは、Javaのコードを一切記述することなく、Activity(Androidのアプリの単位)を作成することができるため、VMを利用せずNative(C,C++を利用した、ハードに依存した実行形式)のアプリとして実行できるため、高速な処理が可能である。Android OSのバージョンは2.2以上、API Levelは 8 からとなる。
*プロジェクトの設定 [#s8365862]
**AndroidManufest.xmlの設定方法 [#wad76f90]
Javaのソースがないことを、AndroidManufest.xmlを通じてその設定を行う必要があり、大きくわけて2つの設定が必要である。
***JavaVMを利用しない旨を宣言 [#ue8c37af]
AndroidManufest.xmlの中の、applivationタグに、以下の宣言を追加する。
android:hasCode="false"
例:<application android:icon="@drawable/icon" android:label="@string/app_name" android:hasCode="false">
***Activityの名前 [#hacae350]
NativeActivityでは、Activityの名前を以下に設定する必要がある。
<activity android:name="android.app.NativeActivity" />
ここは、非常に違和感があると思うが、ようするにNativeActivityのフレームワークを利用している為であり、結果、1アプリに1NativeActivityだけになると考えた方が良さそうだ。
***NativeActivityのファイル名を指定 [#r82a6f62]
この例では、MainActivity.so というコンパイルされた実行形式のファイルを指定。また、このmeta-data節は、Activity節の内側に記述すること。
<meta-data android:name="android.app.lib_name" android:value="MainActivity" />
***エントリポイント名の指定 [#i8214cda]
以下の例では、通常 android_main という関数から起動するものを、android_sub をいう名前でActivityを起動させたい場合の記述例。
<meta-data android:name="android.app.func_name" android:value="android_sub" />
**プロジェクトの設定 [#k2027261]
プロジェクトのプロパティの中のAndroidタグにおいて、選択するライブラリを Android OS 2.3.1 以上を選択する。
*Android.mkファイルの注意点 [#x04ce284]
このNativeActivityをコンパイルするために、特殊なライブラリを組み込む必要があるが、このライブラリを利用するためのAndroid.mkでの指定方法には、記述の順番が非常に大きい意味を持つ。順番が違うとコンパイルできないので注意されたい。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MainActivity
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
特に最後の行は、この位置が絶対位置になる。また、下から2行目のBUILD_SHARED_LIBRARYもこの位置が固定と考えた方が良い。
**新ライブラリ「native_app_glue」について [#d2b284dd]
このAndroid.mkで指定した、native_app_glueは、NativeActivity用に作られたフレームワークであり、NativeActivityを実装するにあたり必要となる。(使わなくても実装できる可能性はあるが、使わない意味が無いためここでは、必須とする)特に以下の特徴を持ったライブラリとなる。
+onTouchなど、JavaのActivityで利用出来たイベントのCallback関数を登録することで、各イベントを取得できる。
+Java上のライブラリで実装されている、UIスレッドの代わりに、NativeActivity用のスレッドが作成され、android_mainがスレッドから呼び出される。
ようするに、Java上のUIライブラリに必要な最低限を提供している、ライブラリということになる。
*関数リファレンス [#hf069c12]
日本語どころか、Android.orgにも説明が無いようなので、一部関数の説明をする。間違っている可能性も高いので、閲覧している諸氏にはご配慮頂きたい。
**LOOPER関数 [#f3bfe047]
イベントプールに登録された、イベントを取得する関数
-[[ヘッダーソースはここ:http://webcache.googleusercontent.com/search?q=cache:GtMzJibb3q4J:mobilepearls.com/labs/native-android-api/include/android/looper.h+ALooper_pollAll&cd=8&hl=ja&ct=clnk&gl=jp&client=firefox-a]]
***ALooper_pollOnceと、ALooper_pollAll [#zc4262bb]
pollOnceは字の通り1度だけイベントを取得する。pollAllはすべてだが、この関数の場合はすべてのイベントが終わるまでコールバックされない。
int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData);
int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData);
|引数番号|型|役割|h
|1|int|正の数の場合はタイムアウトさせる時間をミリ秒で指定、0の場合はblockせずに直ぐに戻る。-1の場合は、イベントが来るまで無限に待ち続ける|
|2|int*|File Discripter番号が代入される(通常はNULLで良い)|
|3|int*|イベント番号が代入される|
|4|void**|イベントのデータポインタが代入される|
''戻り値の詳細''
|戻り値|説明|h
|0, 正の数|正常終了の場合|
|ALOOPER_POLL_WAKE = -1|The poll was awoken using wake() before the timeout expired and no callbacks were executed and no other file descriptors were ready|
|ALOOPER_POLL_CALLBACK = -2|コールバックが1つ以上実行された場合|
|ALOOPER_POLL_TIMEOUT = -3|タイムアウトになった場合|
|ALOOPER_POLL_ERROR = -4|その他のエラーが発生した場合|
***ALooper_acquireとALooper_releaseとALooper_wake [#ee2fda36]
void ALooper_acquire(ALooper* looper);
void ALooper_release(ALooper* looper);
void ALooper_wake(ALooper* looper);
***ALooper_addFdとALooper_removeFd [#cb9c6446]
int ALooper_addFd(ALooper* looper, int fd, int ident, int events,
ALooper_callbackFunc callback, void* data);
int ALooper_removeFd(ALooper* looper, int fd);
終了行:
#contents
*NativeActivityとは? [#k07c122b]
NativeActivityとは、Javaのコードを一切記述することなく、Activity(Androidのアプリの単位)を作成することができるため、VMを利用せずNative(C,C++を利用した、ハードに依存した実行形式)のアプリとして実行できるため、高速な処理が可能である。Android OSのバージョンは2.2以上、API Levelは 8 からとなる。
*プロジェクトの設定 [#s8365862]
**AndroidManufest.xmlの設定方法 [#wad76f90]
Javaのソースがないことを、AndroidManufest.xmlを通じてその設定を行う必要があり、大きくわけて2つの設定が必要である。
***JavaVMを利用しない旨を宣言 [#ue8c37af]
AndroidManufest.xmlの中の、applivationタグに、以下の宣言を追加する。
android:hasCode="false"
例:<application android:icon="@drawable/icon" android:label="@string/app_name" android:hasCode="false">
***Activityの名前 [#hacae350]
NativeActivityでは、Activityの名前を以下に設定する必要がある。
<activity android:name="android.app.NativeActivity" />
ここは、非常に違和感があると思うが、ようするにNativeActivityのフレームワークを利用している為であり、結果、1アプリに1NativeActivityだけになると考えた方が良さそうだ。
***NativeActivityのファイル名を指定 [#r82a6f62]
この例では、MainActivity.so というコンパイルされた実行形式のファイルを指定。また、このmeta-data節は、Activity節の内側に記述すること。
<meta-data android:name="android.app.lib_name" android:value="MainActivity" />
***エントリポイント名の指定 [#i8214cda]
以下の例では、通常 android_main という関数から起動するものを、android_sub をいう名前でActivityを起動させたい場合の記述例。
<meta-data android:name="android.app.func_name" android:value="android_sub" />
**プロジェクトの設定 [#k2027261]
プロジェクトのプロパティの中のAndroidタグにおいて、選択するライブラリを Android OS 2.3.1 以上を選択する。
*Android.mkファイルの注意点 [#x04ce284]
このNativeActivityをコンパイルするために、特殊なライブラリを組み込む必要があるが、このライブラリを利用するためのAndroid.mkでの指定方法には、記述の順番が非常に大きい意味を持つ。順番が違うとコンパイルできないので注意されたい。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MainActivity
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
特に最後の行は、この位置が絶対位置になる。また、下から2行目のBUILD_SHARED_LIBRARYもこの位置が固定と考えた方が良い。
**新ライブラリ「native_app_glue」について [#d2b284dd]
このAndroid.mkで指定した、native_app_glueは、NativeActivity用に作られたフレームワークであり、NativeActivityを実装するにあたり必要となる。(使わなくても実装できる可能性はあるが、使わない意味が無いためここでは、必須とする)特に以下の特徴を持ったライブラリとなる。
+onTouchなど、JavaのActivityで利用出来たイベントのCallback関数を登録することで、各イベントを取得できる。
+Java上のライブラリで実装されている、UIスレッドの代わりに、NativeActivity用のスレッドが作成され、android_mainがスレッドから呼び出される。
ようするに、Java上のUIライブラリに必要な最低限を提供している、ライブラリということになる。
*関数リファレンス [#hf069c12]
日本語どころか、Android.orgにも説明が無いようなので、一部関数の説明をする。間違っている可能性も高いので、閲覧している諸氏にはご配慮頂きたい。
**LOOPER関数 [#f3bfe047]
イベントプールに登録された、イベントを取得する関数
-[[ヘッダーソースはここ:http://webcache.googleusercontent.com/search?q=cache:GtMzJibb3q4J:mobilepearls.com/labs/native-android-api/include/android/looper.h+ALooper_pollAll&cd=8&hl=ja&ct=clnk&gl=jp&client=firefox-a]]
***ALooper_pollOnceと、ALooper_pollAll [#zc4262bb]
pollOnceは字の通り1度だけイベントを取得する。pollAllはすべてだが、この関数の場合はすべてのイベントが終わるまでコールバックされない。
int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData);
int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData);
|引数番号|型|役割|h
|1|int|正の数の場合はタイムアウトさせる時間をミリ秒で指定、0の場合はblockせずに直ぐに戻る。-1の場合は、イベントが来るまで無限に待ち続ける|
|2|int*|File Discripter番号が代入される(通常はNULLで良い)|
|3|int*|イベント番号が代入される|
|4|void**|イベントのデータポインタが代入される|
''戻り値の詳細''
|戻り値|説明|h
|0, 正の数|正常終了の場合|
|ALOOPER_POLL_WAKE = -1|The poll was awoken using wake() before the timeout expired and no callbacks were executed and no other file descriptors were ready|
|ALOOPER_POLL_CALLBACK = -2|コールバックが1つ以上実行された場合|
|ALOOPER_POLL_TIMEOUT = -3|タイムアウトになった場合|
|ALOOPER_POLL_ERROR = -4|その他のエラーが発生した場合|
***ALooper_acquireとALooper_releaseとALooper_wake [#ee2fda36]
void ALooper_acquire(ALooper* looper);
void ALooper_release(ALooper* looper);
void ALooper_wake(ALooper* looper);
***ALooper_addFdとALooper_removeFd [#cb9c6446]
int ALooper_addFd(ALooper* looper, int fd, int ident, int events,
ALooper_callbackFunc callback, void* data);
int ALooper_removeFd(ALooper* looper, int fd);
ページ名: