android JNI
2852 ワード
Java Native Interface(JNI)規格はjavaプラットフォームの一部であり、Javaコードと他の言語で書かれたコードとのインタラクションを可能にする.JNIは、Java仮想マシン(VM)内部で実行されるJavaコードが、C、C+、アセンブリ言語などの他のプログラミング言語で作成されたアプリケーションおよびライブラリとインタラクティブに動作するようにするローカルプログラミングインターフェースです.
例:
A:レイヤーを呼び出します.
package com.hello.jnitest
publicclass Nadd { static {System.loadLibrary("jni_mytest"); }public native void nativeTest();//無参
public native int nadd(int a,int b);//有参}
B:実装層
Android.mkファイル定義
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libjni_mytest//最後にライブラリを生成したときの名前LOCAL_SRC_FILES := myjni.c//コンパイルするソースファイルのファイル名include$(BUILD_SHARED_LIBRARY)/NDKコンパイル時に共有ライブラリが生成されることを示す
//_______________
myjni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_hello_jnitest_Nadd */
#ifndef _Included_com_hello_jnitest_Nadd
#define _Included_com_hello_jnitest_Nadd
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT void JNICALL Java_com_hello_jnitest_Nadd_nativeTest (JNIEnv *, jobject);
JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd (JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
myjni.c
#include
#include "myjni.h"
JNIEXPORT void JNICALL Java_com_hello_jnitest_Nadd_nativeTest(JNIEnv * env, jobject c, jint a, jint b)
{
..........
}
JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv * env, jobject c, jint a, jint b)
{
return (a+b);
}
A:レイヤーを呼び出します.
1:System.loadLibrary()でJNIライブラリをロードします.
2:Javaのnative関数を宣言します.
System.loadLibrary(「jni_mytest」);
native関数の宣言
public native int nativeTest();//キーワード:native
B:実装層
アクセスを実現するインタフェース
インタフェース宣言
C :Java_pacakege_class_method
JNIのデータ型
Javaの関数タイプには、基本データ型と参照データ型があります.では、これらのタイプはJNI層で何になるのでしょうか.次の表は、JNIレイヤのデータ変換です.
参照データ型変換:
Javaリファレンスタイプ
Nativeタイプ
Javaリファレンスタイプ
Nativeタイプ
All objects
jobjects
char[]
jcharArray
Java.long.Class
jclass
short[]
jshortArray
Java.lang.String
Jstring
int[]
jintArray
Object[]
jobjectArray
long[]
jlongArray
boolean[]
jbooleanArray
float[]
floatArray
byte[]
jbyteArray
double[]
jdoubleArray
java.lang.Throwable
jthrowable
基本データ型
Java
boolean
byte
char
short
int
long
float
double
Native
jboolean
jbyte
jchar
jshort
jint
jlong
jfloat
jdouble