web-dev-qa-db-ja.com

androidのJniチュートリアル

こんにちは、誰も私にAndroidといくつかの良いJNIチュートリアルのためにJNIを学ぶための良いリソースを提案できますか?

48
Vishwanath.M

NDKをダウンロードすることをお勧めします。解凍して、サンプルフォルダー ndk コードを参照します。 hello-jniから始めて、さらに進んでください。それは簡単にたくさん説明します。 これらリンク および this を参照して、コードを確認しながら前後に移動することもできます。

17
Raulp

Eclipseのチュートリアル

ここに firstsecond の小さなチュートリアルがありますが、JNIを使​​用する簡単なプログラムを書きたい場合は、読み続けてください:)

Create Android application project、プロジェクトが作成されたら、プロジェクトの最上位レベル内に新しいフォルダーを作成する必要があります。これを行うには、プロジェクト名を右クリック→新規作成→フォルダー:このフォルダーにjniという名前を付けます。名前SquaredWrapperのクラスを追加するよりも、これらのコードを追加します

package org.edwards_research.demo.jni;

public class SquaredWrapper {
    // Declare native method (and make it public to expose it directly)
    public static native int squared(int base);

    // Provide additional functionality, that "extends" the native method
    public static int to4(int base)
    {
        int sq = squared(base);
        return squared(sq);
    }

    // Load library
    static {
        System.loadLibrary("square");
    }
} 

ターミナルを開きます。ヘッダーファイルを取得するには、これらのコードをコンパイルする必要があります。最初にこのコマンドを呼び出します。

cd src # change into the source directory
javac -d /tmp/ org/edwards_research/demo/jni/SquaredWrapper.Java

より

cd /tmp
javah -jni org.edwards_research.demo.jni.SquaredWrapper

したがって、tmpディレクトリにorg.edwards_research.demo.jni.SquaredWrapperという名前のヘッダーファイルがあります。

それはこのようなものでなければなりません

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_edwards_research_demo_jni_SquaredWrapper */

#ifndef _Included_org_edwards_research_demo_jni_SquaredWrapper
#define _Included_org_edwards_research_demo_jni_SquaredWrapper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_edwards_research_demo_jni_SquaredWrapper
 * Method:    squared
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_org_edwards_1research_demo_jni_SquaredWrapper_squared
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

たとえば、square.hのように、これらの名前を短い名前に変更してください。このヘッダーファイルをアプリのjniフォルダーにコピーします。同じフォルダにsquare.cファイルを作成するよりも、これをコピーします。

 #include "square.h"

JNIEXPORT jint JNICALL Java_com_example_Android_1jni_1second_1demo_SquaredWrapper_squared
      (JNIEnv * je, jclass jc, jint base)
    {
            return (base*base);
    }

これをMainActivity.Javaに追加します

int x = SquaredWrapper.to4(2);
        x = x*2;

この本文を含むjniフォルダーにAndroid.mkファイルを追加します

    LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := squared
LOCAL_SRC_FILES := square.c

include $(BUILD_SHARED_LIBRARY)

ヘッダーファイルとcppファイルからライブラリを作成する必要があります。

ですから、私の first linkを見ていくつかの設定を行うだけでよいのです。これでコンパイルできます。ライブラリが作成され、libディレクトリがそれを構成していることを確認してください。

Android Studioのチュートリアル

シンプルなAndroidアプリケーションを開くAndroid Studio

ステップ1:Android Studioでアプリケーションを開く

ステップ2:NDKをダウンロードし、アプリケーションのローカルプロパティでNDKへのパスを設定します(Android SDKパス)このようなndk.dir=C\:\\Android\\Android-ndk-r10e

追伸Windowsの場合は// //、Linuxの場合は/

step3:アプリにJNIフォルダーを追加します(アプリを右クリック->新規->フォルダー-> JNIフォルダー)

ステップ4次の方法でGradleをセットアップします。

NDKを起動するためにapp/build.gradleにこのコードを追加します

   sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir 'src/main/libs'
    }

    tasks.withType(NdkCompile) { // disable automatic ndk-build call
    compileTask -> compileTask.enabled = false
    }

    task ndkBuild(type: Exec) { // call ndk-build(.cmd) script
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'cmd', '/c', 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }

   tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }

ステップ4:

この本体を使用して、アプリのJNIフォルダーにAndroid.mkおよびApplication.mkファイルを作成します。

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.cpp

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI := all
include $(BUILD_SHARED_LIBRARY)

APP_ABIでは、使用するコンパイラを選択します。それ

ステップ5:

build.configからNDKを無効にするため、手動でNDKを実行する必要があります。 src\main\jnフォルダーにcom_example_nativedemo_app_MainActivit.hファイルを作成するには、ターミナルでこのコマンドを実行する必要があります

javah -d .\jni -classpath C:\Intel\INDE\IDEintegration\Android-sdk-windows\platforms\Android-21\Android.jar;..\..\build\intermediates\classes\debug com.example.mydemo.nativedemo.MainActivity

windows cmdの場合、ファイルの完全パスを指定する必要があります。ために

ステップ6:

この本文を使用して、JNIフォルダーにファイルmain.cppを追加します。

#include <string.h>
#include <jni.h>
#include <vchat_cpptest_Hellojnicpp.h>

extern "C" {
      JNIEXPORT jstring JNICALL
      Java_vchat_cpptest_Hellojnicpp_stringFromJNI
      (JNIEnv *env, jobject obj)
      {
            #ifdef __INTEL_COMPILER_UPDATE
              return env->NewStringUTF("Hello from Intel C++ over JNI!");
          #else
              return env->NewStringUTF("Hello from default C++ over JNI!");
          #endif
}
45
Hayk Nahapetyan