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进程中

转载于:https://my.oschina.net/whchsh/blog/142572

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值