サーチ…


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 (実行可能パーミッションでpushchmod )またはアプリケーションから(実行可能パーミッションでそれを抽出して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);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow