こんにちは、誰も私にAndroidといくつかの良いJNIチュートリアルのためにJNIを学ぶための良いリソースを提案できますか?
Eclipseのチュートリアル
ここに first と second の小さなチュートリアルがありますが、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
}