サーチ…


備考

Android NDKとは何ですか?

Androidネイティブ開発キット(NDK)は、Android SDKのコンパニオンツールで、C / C ++でアプリケーションの一部を組み込むことができます。これは次の場合に便利です。

  • プラットフォーム間でアプリケーションコンポーネントを共有する(Android、iOS、Linuxなど)
  • 重要な部分のパフォーマンスを向上させる
  • 既存のC / C ++ライブラリの再利用

NDKは、開発者がC / C ++でプログラミングをしながら、アクティビティを構築し、ユーザーの入力を処理し、ハードウェアセンサーを使用し、アプリケーションリソースにアクセスするなどのヘッダーとライブラリを提供します。

バージョン

バージョン発売日
r12 2016-06-09
r11 2016-03-09
r10 2014-07-01

簡単な例でのAndroid NDKの使い方

Android Studio 2.2以降のネイティブ開発キット(NDK)を使用すると、CおよびC ++コードをコンパイルすることができます。

手動でNDKをダウンロードしてビルドしたり、ビルドしたり、CMakeを使ってNDKを使用することができます。

ここでは、NDKとサンプルコードを手動でインストールするためのプロセスフローを示します。

システムのOSに基づいて、NDKをこの場所( https://developer.android.com/ndk/downloads/index.html)からダウンロードできます

ダウンロードした後、システム環境変数のパスを変数名 " NDK_PROJECT_PATH "と変数値 "NDK格納パスの場所"として指定します。

  • 次に、NDKとAndroid Studioを統合するために、新しいAndroidプロジェクトを作成した後、

    gradle - ローカルプロパティでは、sdkのようなパスの場所を追加する

     sdk.dir=F\:\\gowtham\\Android\\sdk
    

    そして

      android.useDeprecatedNdk = true
    
  • 次に、Build - Make Project(Ctrl + f9)を押します。

    あなたのプロジェクトは成功裏に構築され、以下に示すように、メッセージgradle buildでBUILD SUCCESFULを取得します。

ここに画像の説明を入力

その後、Terminalでは、最初にプロジェクトのパス

cd app/src/main追加する

パスはプロジェクトパスからメインパスに拡張されます。

次に、もう一度Build - Make Project(Ctrl + f9)をクリックします。

以下に示すように、 app-build-intermediates-classes-debugフォルダの下にあります。

ここに画像の説明を入力

ここで、app / src / main / javaの下に新しいJavaクラスファイルを作成します。ここではNativeClassという名前のJavaファイルを作成しました

ここに画像の説明を入力

関数名と関数のための入力を持つ単純な呼び出し関数を書くここで私は例として関数を書いて、それに2つの整数入力を与え、

ここに画像の説明を入力

再度プロジェクトをビルドします(Ctrl + f9)

ビルドすると、このようにビルドされたクラスファイルが見つかるでしょう。

ここに画像の説明を入力

Then,in terminal 
    `-Javah  -d  jni –classpath ../../build/intermediates/classes/debug`application.com.ndkapplication.NativeClass

ここで、 - d - 出力ディレクトリ用 - jni - JNI形式のヘッダファイルを生成する(デフォルト) - classpath - クラスをロードする

今度はプロジェクト(Ctrl + f9)をビルドすると、 jniフォルダが作成され、以下に示すように、前にターミナルで指定した名前でヘッダファイルが作成されます

ここに画像の説明を入力

今度はヘッダファイルをコピーし、ヘッダファイルと同じ名前の.cppまたは.cファイルをjniフォルダに保存します。

私は以下のようにcppファイルを作成しました

ここに画像の説明を入力

Delete everything before **JNIEXPORT line** in this file and **add header file name** alone.
Here I am for simple example just adding two numbers and returning value to android java.

Application_com_ndkapplication_NativeClass.cpp

 #include <application_com_ndkapplication_NativeClass.h>

JNIEXPORT jint JNICALL Java_application_com_ndkapplication_NativeClass_example
  (JNIEnv *, jclass , jint as , jint bs){

    return (as + bs);

    }

この例では、ヘッダファイルに関数を追加する必要はありません。

JniフォルダにAndroid.mkApplication.mkという名前の新しいファイルを作成する

Android.mkファイルは、ソースをビルドシステムに記述するためのファイルです。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := application_com_ndkapplication_NativeClass.cpp

LOCAL_LDLIBS += -llog

LOCAL_MODULE := exp-jni

include $(BUILD_SHARED_LIBRARY)

このファイルの詳細を知るにはこのリンクから読んでくださいhttps://developer.android.com/ndk/guides/android_mk.html

ここに画像の説明を入力

アプリケーションが必要とするネイティブモジュールを記述するApplication.mk。

Application.mk

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti –fexceptions

APP_ABI := armeabi-v7a armeabi arm64-v8a mips mips64 x86 x86_64

APP_PLATFORM := android-16

このリンクから読むこのファイルの詳細を知るにはhttps://developer.android.com/ndk/guides/application_mk.html

ここに画像の説明を入力

 Now build the project again **(Ctrl + f9)**, you will find the **armeabi-v7a, armeabi, arm64-v8a ,mips, mips64, x86 and x86_64** folder created inside jniLibs.

次に、メインアクティビティでは、ネイティブクラスファイルの入力と出力を渡します。

int a = 5, b = 5, res ;

res = NativeClass.example(((int) a),((int) b));

TextView textView = (TextView) this.findViewById(R.id.tv);

textView.setText(new Integer(res).toString());

ここでは、a、bで2つの整数を入力し、変数resから出力を得ました。

得られた出力は、TextViewに渡すことで画面に表示されます。

そして、あなたはこのようなLOCAL_MODULEとしてAndroid.mkファイルで指定されたライブラリを追加することを忘れないでください、

static {
        System.loadLibrary("exp-jni");
  }

最後にプロジェクトをもう一度ビルドすると(Ctrl + f9)、各armeabi-v7a、armeabi、arm64-v8a、mips、mips64、x86およびx86_64フォルダの下に作成された.soファイルが見つかります。

ここに画像の説明を入力

次にアプリケーションを実行すると、この例の出力は10になります。

ここに画像の説明を入力

これはNDKの初心者のための基本的なプログラムです、OpenCVライブラリはここにインポートすることができますまた、画像処理アプリケーションを行うことができます。



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