Linux平台Java调用so库JNI使用例子

摘要:
JavacHelloJNI。java 4.编译。类文件,以生成相应的。h头文件。本例中生成的头文件是net_wangliping_HelloJNI。hjavahnet表示。王丽萍。HelloJNI 5.编写HelloJNI。c文件,引用。h头文件,并实现其中声明的方法。

1.确保gcc编译器已安装

2.编写HelloJNI.java代码,用native声明需要用C实现的函数。
如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/test/net/wangliping/HelloJNI.java

 



package net.wangliping
public class HelloJNI
{
   static
    {

        System.loadLibrary("goodluck");
    }

   public native static int get();
   public native static void set(int i);

   public static void main(String[] args)
    {
        HelloJNI test = new HelloJNI();
        test.set(10);
        System.out.println(test.get());
    }
}

 

 

 

3.在HelloJNI.java文件所在目录下编译.java文件。

javac HelloJNI.java

4.在~/Desktop下编译第三步中生成的.class文件,生成对应的.h头文件,本例中生成的头文件名为 net_wangliping_HelloJNI.h

javah net.wangliping.HelloJNI

5.编写HelloJNI.c文件,实现引用第4步中生成的.h头文件,并实现其中声明的方法。

 



#include "net_wangliping_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_net_wangliping_HelloJNI_get(JNIEnv *env, jclass jc)
{
   return i;
}

JNIEXPORT void JNICALL Java_net_wangliping_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
    i = j;
}

 

 

 

6.将第5步中编写的HelloJNI.c文件,编译成.o文件

gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c HelloJNI.c

注:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include 是jni.h头文件所在的路径
/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux 是jni_md.h所在的路径

7.将第6步中生成的HelloJNI.o文件编译成.so库文件

gcc -shared HelloJNI.o -o libgoodluck.so

注:和windows下不同,linux的库文件必须是以libxxx.so形式命令的(或者 libxxx.so.y,y是版本号),lib前缀是为了系统能够识别它,xxx是java代码System.loadLibrary("xxx");中引用库的名字。

8.将第7步中生成的libgoodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。
前提是你有足够的权限,如果没有sudo权限的同学,用下面的方法:
1) 在/home下建立一个用来存放.so库文件的目录,比如/home/swan/lib
2) 把libgoodluck.so文件拷贝到该目录下
3)打开Terminal,运行如下命令

export LD_LIBRARY_PATH=/home/swan/lib

只在当前shell下有效...

补充:以下方法可以直接利用绝对路径来load这个so库文件,从而无需做上述的放置path或者更改库路径的动作。

 


static {
    System.load("/home/swan/test/libgoodluck.so"
);
}

 

9.在运行HelloJNI.class

java net.wangliping.HelloJNI

一切正常后,可以看到运行結果是输出了10,其值是由C语言代码实现并返回的。

免责声明:文章转载自《Linux平台Java调用so库JNI使用例子》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇react之npm和yarn的相关命令php 取整数小结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java中的native关键字

JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。       使用jav...

Redis学习-安装(一)

实践是检验真理的唯一标准      学习新事物,新技能,动手尝试才是最好的办法,否则就是纸上谈兵,在学习Redis之前,首先要安装redis的运行环境,了解它的基础命令和基本知识。 一.下载redis   进入redis官网的下载页面https://redis.io/download   从这个页面我们可以得到的一些基本信息是,redis分为稳定版和非稳...

Ubuntutar命令

tar zxvf ut6410-android2.1.tgz tar zcvf ut6410-android2.1.tgz ut6410-android2.1/ tar --exclude ut6410-android2.1/out-zcvf ut6410-android2.1.tgz ut6410-android2.1/ tar命令 [root@lin...

在Debian中启用Bootsplash

http://www.linux-wiki.cn/index.php?title=%E5%9C%A8Debian%E4%B8%AD%E5%90%AF%E7%94%A8Bootsplash&variant=zh-cn 在Debian中启用Bootsplash 此页由Linux Wiki用户Chenxing于2008年2月7日 (星期四) 02:13的...

简单的 nginx 多站点配置

测试环境:基于CentOS6.8 编译安装LNMP(http://www.cnblogs.com/afee666/p/6836161.html) 一 需求 在一个 VPS 主机上配置 web 服务器,实现通过一个 IP 访问多个站点或域名。 假设: IP地址: 66.88.33.11 域名1 test1.example.com放在 /web/www/tes...

Android深入浅出之 AudioTrack分析

Android深入浅出之Audio 第一部分 AudioTrack分析 一 目的 本文的目的是通过从Audio系统来分析Android的代码,包括Android自定义的那套机制和一些常见类的使用,比如Thread,MemoryBase等。 分析的流程是: l         先从API层对应的某个类开始,用户层先要有一个简单的使用流程。 l        ...