Android
Android NDK
サーチ…
Android用のネイティブ実行ファイルの作成
プロジェクト/ jni / main.c
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("Hello world!\n");
return 0;
}
project / jni / Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)
プロジェクト/ jni / Application.mk
APP_ABI := all
APP_PLATFORM := android-21
Androidバージョンが5.0(API 21)未満の端末をサポートするには、 APP_PLATFORM
を古いAPIに設定してバイナリをコンパイルする必要があります(例: android-8
。これは、Android 5.0が位置非依存バイナリ (PIE)を実施した結果ですが、古いデバイスは必ずしもPIEをサポートしていません。したがって、デバイスのバージョンに応じて、PIEまたは非PIEのいずれかを使用する必要があります。 Androidアプリケーション内からバイナリを使用する場合は、APIレベルをチェックして正しいバイナリを抽出する必要があります。
APP_ABI
は、 armeabi
などの特定のプラットフォームに変更して、これらのアーキテクチャのバイナリのみをビルドすることができます。
最悪の場合、アーキテクチャごとにPIEと非PIEの両方のバイナリ(ndk-r10eを使用する約14個の異なるバイナリ)があります。
実行可能ファイルをビルドするには:
cd project
ndk-build
バイナリはproject/libs/<architecture>/hello_world
ます。あなたはADB
(実行可能パーミッションでpush
とchmod
)またはアプリケーションから(実行可能パーミッションでそれを抽出してchmod
)使用することができます。
CPUのアーキテクチャを決定するには、ビルドプロパティの取得ro.product.cpu.abi
主要なアーキテクチャまたはのためro.product.cpu.abilist
サポートされているアーキテクチャの完全なリストについては、(新しいデバイス上に)。アプリケーション内からandroid.os.Build
クラスを使用するか、ADB経由でgetprop <name>
を使用してこれを行うことができます。
ビルドのクリーンアップ方法
ビルドをきれいにする必要がある場合:
ndk-build clean
Android.mk以外のメイクファイルの使い方
ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk
ndkへのログイン方法
まず、 Android.mk
ファイルのロギングライブラリにリンクされていることを確認してください:
LOCAL_LDLIBS := -llog
次に、次の__android_log_print()
呼び出しのいずれかを使用します。
#include <android/log.h>
#define TAG "MY LOG"
__android_log_print(ANDROID_LOG_VERBOSE, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_WARN, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_DEBUG, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_INFO, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_ERROR, TAG, "The value of 1 + 1 is %d", 1 + 1)
または、対応するマクロを定義することで、より便利な方法でそれらを使用します。
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
例 :
int x = 42;
LOGD("The value of x is %d", x);