JNI编程学习1

本文介绍构建最简单的JNI程序,以下步骤在Linux环境测试通过

1、创建Test.java文件

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函数直接加载动态库文件

2、编译生成Test.class文件

javac Test.java

3、生成Test.h文件

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函数

4、写入Test.c

#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函数写入函数体,打印输入的两个整数的和

5、编译生成C动态库(libTest.so)

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下,需要手动添加头文件路径

6、运行Java进程

java –cp . Test

1 + 3 = 4

这样,C代码执行结果呈现在Java进程中

你可能感兴趣的:(jni)