手把手一个一个脚印制作使用jni(java调用c库)

环境:debian6.

安装c语言编译工具:apt-get install build-essential
编写java代码:

package com.netease.test.model;

/**
 * Created by hzjiaoguangcai on 2017/6/22.
 */
public class JniDemo {
    //使用JAVAH命令生成包含native方法定义的C/C++头文件。
    //该命令需要使用JDK/bin目录下javah.exe
    public native void sayHello(int a,boolean b);
    static {   System.loadLibrary("demo");   };

    /**
     * @param args
     */
    public static void main(String[] args) {
        JniDemo jniDemo = new JniDemo();
        System.out.println(System.getProperty("java.library.path"));
        jniDemo.sayHello(100,false);
    }
}
在java工程的com同级目录下编译执行

/usr/lib/jvm/jdk8/bin/javac com/netease/test/model/JniDemo.java 生成com/netease/test/model/JniDemo.class文件

然后 执行/usr/lib/jvm/jdk8/bin/javah  com.netease.test.model.JniDemo,

会在com统计目录下生成一个com_netease_test_model_JniDemo.h的文件,

内容

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_netease_test_model_JniDemo */


#ifndef _Included_com_netease_test_model_JniDemo
#define _Included_com_netease_test_model_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_netease_test_model_JniDemo
 * Method:    sayHello
 * Signature: (IZ)V
 */
JNIEXPORT void JNICALL Java_com_netease_test_model_JniDemo_sayHello
  (JNIEnv *, jobject, jint, jboolean);


#ifdef __cplusplus
}
#endif
#endif


编写一个这个头文件的实现demo.c,内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <stdio.h>
/* Header for class com_netease_test_model_JniDemo */
#include "com_netease_test_model_JniDemo.h"
/*
 * Class:     com_netease_test_model_JniDemo
 * Method:    sayHello
 * Signature: ()V
 */
 JNIEXPORT void JNICALL Java_com_netease_test_model_JniDemo_sayHello
  (JNIEnv *a, jobject jo, jint i, jboolean b){
  printf("HelloWorld JNI %d! %d\n",i,b);
  }


编译这个.c文件产生一个共享动态库,debian(32位)系统中在demo.c所在目录下执行的命令。

gcc -o libdemo.so -fPIC -shared demo.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/i386/client

这时候产生一个libdemo.so的文件,将libdemo.so复制到/usr/lib目录下。备注,可以现根据

System.out.println(System.getProperty("java.library.path"));的输出结果加载库所在的位置,而把libdemo.so放在
响应的位置。
最后编译JniDemo.java
/usr/lib/jvm/jdk8/bin/javac com/netease/test/model/JniDemo.java 

运行:

/usr/lib/jvm/jdk8/bin/java com/netease/test/model/JniDemo

输出

/usr/java/packages/lib/i386:/lib:/usr/lib
HelloWorld JNI 100! 0


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值