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 |