首先要说明的是JNI是JAVA所用有的特性而不是Android添加的,可能很多JAVA程序员看了会说这还要你说,但是我要说的是从事Android平台开发的工程师大部分是以C/C++为主要编程语言的,对于JAVA他们大多是半路出家甚至是就没有去学习过JAVA,而是当做C++来理解的。所以不清楚一些JAVA的特性也是正常的。
既然是JAVA的特性,那么就先在纯JAVA的环境下来实验,先编写一段JAVA代码:
<span style="font-size:14px;">class HelloJNI
{
native void printHello();
native void printString(String str);
static {
System.loadLibrary("hellojni");
}
public static void main(String args[])
{
HelloJNI myJNI = new HelloJNI();
myJNI.printHello();
myJNI.printString("Hello World from printString fun");
}
}</span>
使用:javac HelloJNI.java
这里申明了两个本地方法: native void printHello(); native void printString(String str);
然后使用 javah HelloJNI生成HelloJNI.h
<span style="font-size:14px;">/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printHello
(JNIEnv *, jobject);
/*
* Class: HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printString
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif</span>
这个头文件是自动生成,不要做任何修改。然后再编写C代码:
<span style="font-size:14px;">#include "HelloJNI.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject obj, jstring string)
{
const char *str = (*env)->GetStringUTFChars(env, string, 0);
printf("%s!\n", str);
return;
}</span>
接下来要生成动态库:
gcc -shared -fpic -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ hellojni.c -o libhellojni.so
检查一下libhellojni.so是否已经生成,接下来就可以验证我们的java代码了,
java -Djava.library.path=. HelloJNI
注意这里要指定一下java.library.path到动态库的路径,这样就可以了。