本文介绍构建最简单的JNI程序,以下步骤在Linux环境测试通过
public class Test{
static {
System.loadLibrary("Test");
}
public static native void PrintSum(int a, int b);
static public void main(String[] args){
Test.PrintSum(1, 3);
}
}
PrintSum函数是一个JNI调用函数,设计打印两个整数的求和,它在Java代码仅有函数声明,没有函数体,它必须声明为native
System.loadLibrary函数加载后续步骤生成的C动态库文件,当然也可以使用load函数直接加载动态库文件
javac Test.java
javah Test
Test.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */
#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: PrintSum
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_Test_PrintSum
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
Java_Test_PrintSum是javah命令自动生成的函数,它对应Java代码的PringSum函数
#include <jni.h>
#include "Test.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_Test_PrintSum
(JNIEnv *env, jobject obj, jint a, jint b){
printf("%d + %d = %d", a, b, a+b);
}
为Java_Test_PrintSum函数写入函数体,打印输入的两个整数的和
gcc -shared Test.c -Wall -fPIC -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/linux -o libTest.so
注意这里命名为libTest.so是有原因的,java程序loadLibrary会依照文件名查找,如果命名为Test.so会提示找不到Test
另外jni.h和jni_md.h分别在jdk的include目录和include/linux下,需要手动添加头文件路径
java –cp . Test
1 + 3 = 4
这样,C代码执行结果呈现在Java进程中