Windows下Java调用本地方法采用的是dll(Dynamic Link library),而Linux下用的是.so文件,以下描述下调用的步骤。
假设我在/home/jreffery/JavaTest/lib下,下面有目录结构cc/appweb/www/JniTest.java
1.编写包含native方法的Java类:
package cc.appweb.www;
public class JniTest{
public native void setInt(int i);
public native int getInt();
public static void main(String args[]){
JniTest jniTest = new JniTest();
jniTest.setInt(520);
System.out.println(jniTest.getInt());
}
}
在当下目录得到一个c的.h文件 cc_appweb_www_JniTest.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cc_appweb_www_JniTest */
#ifndef _Included_cc_appweb_www_JniTest
#define _Included_cc_appweb_www_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: cc_appweb_www_JniTest
* Method: setInt
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_cc_appweb_www_JniTest_setInt
(JNIEnv *, jobject, jint);
/*
* Class: cc_appweb_www_JniTest
* Method: getInt
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_cc_appweb_www_JniTest_getInt
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3.同级目录下创建main.cpp 用以实现上述头文件的函数
#include <iostream>
#include "cc_appweb_www_JniTest.h"
/*
* Class: cc_appweb_www_JniTest
* Method: setInt
* Signature: (I)V
*/
int i = 0;
JNIEXPORT void JNICALL Java_cc_appweb_www_JniTest_setInt(JNIEnv * en, jobject jo, jint j){
i = j;
}
/*
* Class: cc_appweb_www_JniTest
* Method: getInt
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_cc_appweb_www_JniTest_getInt(JNIEnv * en, jobject j){
return i;
}
先编译成.o文件
gcc -fPIC -I /usr/lib/jvm/java-1.7.0-openjdk-i386/include/ -I /usr/lib/jvm/java-1.7.0-openjdk-i386/include/linux/ -c main.cpp
因为上述头文件中引用了<jni.h>,所以需要将所需的头文件加进来一起编译,而这些所需头文件是随jdk一起发布的,放jdk目录下。
再编译成.so文件
gcc -shared main.o -o libTest.so
5.再次修改Java类,在静态区域加载该.so文件
写上绝对路径
package cc.appweb.www;
public class JniTest{
static{
System.load("/home/jreffery/JavaTest/lib/libTest.so");
}
public native void setInt(int i);
public native int getInt();
public static void main(String args[]){
JniTest jniTest = new JniTest();
jniTest.setInt(520);
System.out.println(jniTest.getInt());
}
}
6.编译该类至同级的classes文件夹下
javac -d ../classes cc/appweb/www/JniTest.java
执行结果,成功调用。