编译的目标平台为X86架构,本地终端可以直接调用执行。整个构建的流程是从上到下(Java->C)构建。
第一步,编写自己的MyJni.java类,如下:
public class MyJni {
public native void display();
public native double sum(double x, double y);
public static void main(String[] args) {
MyJni myjni = new MyJni();
System.out.print(myjni.sum(1,1));
System.out.print("\n");
myjni.display();
}
static {
System.load("/home/kongbo/test/java/libkb_jni.so");
}
}
第二步,需要生成响应的JNI头文件,执行: javah MyJni,会在当前目录下生成MyJni.h,
内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyJni */
#ifndef _Included_MyJni
#define _Included_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: MyJni
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_MyJni_display
(JNIEnv *, jobject);
/*
* Class: MyJni
* Method: sum
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_MyJni_sum
(JNIEnv *, jobject, jdouble, jdouble);
#ifdef __cplusplus
}
#endif
#endif
第三步,实现上一步中自动生成的头文件中的函数实体文件。kongbo_jni.c
#include <jni.h>
#include <stdio.h>
#include "MyJni.h"
JNIEXPORT void JNICALL Java_MyJni_display
(JNIEnv *env, jobject obj) {
printf("Here comes kongbo's JNI interface\n");
}
/*
* Class: MyJni
* Method: sum
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_MyJni_sum
(JNIEnv *env, jobject obj, jdouble a, jdouble b) {
return a + b;
}
第四步,代码工作基本完成,需要出.class文件以及相应的so库了。
对于.class文件,终端执行:javac MyJni 即可在当前目录生成。
对于so库,敝人写了一个高端的Makefile,内容如下:
JNI_PATH:=/opt/java/jdk1.6.0_45/include
JNI_LINUX:=/opt/java/jdk1.6.0_45/include/linux
CFLAG:= -fPIC -D_REENTRANT -I $(JNI_PATH) -I $(JNI_LINUX)
libkb_jni.so: kongbo_jni.o
cc -shared kongbo_jni.o -o libkb_jni.so
kongbo_jni.o: kongbo_jni.c MyJni.h
cc $(CFLAG) -c kongbo_jni.c
.PHONY: clean
clean:
rm libkb_jni.so kongbo_jni.o
然后执行make,即可生成.so文件喽。。。
第五步,运行结果:
终端执行 java MyJni
2.0
Here comes kongbo's JNI interface
目标达成!!!
欢迎回帖交流~~~~~~