JNI 是 Java Native Interface 的缩写,即JAVA本地接口。
JNI 是 Java 的一部分,不是Android引入的。
首先介绍JNI在 JAVA 下的示例,再介绍如何在Android下使用。
eclipse建立Java Application工程——TestJNI
(1) Java类中编写native声明的方法:TestJNI.java ,位于工程的com.wps.jni包下:
package com.wps.jni;
public class TestJNI {
public native String getText(String name);
static
{
System.loadLibrary("testjni");
}
}
(2) javah 生成相应的JNI样式的c/c++头文件:
java文件被编译后放到bin目录下,如本例: <工程目录>/bin/com/wps/jni/TestJNI.class
(若没自动生成class文件,需要javac编译,并放到上面目录中,eclipse下会自动编译。)
进入<工程目录>/bin,运行javah -classpath . -jni com.wps.jni.TestJNI (包名必须一致)
会生成com_wps_jni_TestJNI.h。其内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_wps_jni_TestJNI */
#ifndef _Included_com_wps_jni_TestJNI
#define _Included_com_wps_jni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_wps_jni_TestJNI
* Method: getText
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_wps_jni_TestJNI_getText
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
(3) 编写c++代码实现上面函数 。 com_wps_jni_TestJNI.cpp。 内容如下:
#include <jni.h>
#include "com_wps_jni_TestJNI.h"
jstring JNICALL Java_com_wps_jni_TestJNI_getText
(JNIEnv *env, jobject obj, jstring name)
{
char s[80];
const char* str = env->GetStringUTFChars( name, NULL );
sprintf( s, "hello,%s!", str );
env->ReleaseStringUTFChars( name, str );
jstring r_str = env->NewStringUTF( s );
return r_str;
}
(4) 编译生成动态链接库(linux下.so)
g++ com_wps_jni_TestJNI.cpp -I /usr/local/jvm/jdk1.8/include -I /usr/local/jvm/jdk1.8/include/linux -fPIC -shared -o libtestjni.so
(5) 编写main函数测试:
TestJNI jnir = new TestJNI();
System.out.println(jnir.getText("world"));
注意:eclipse下如果想使用System.loadLibrary("testjni")来载入的话,需要在eclipse的build path下Libraries的Native library添加路径。