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 <jni.h>

/* 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 <stdlib.h>

#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