当前位置: 首页 > news >正文

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

转自:http://blog.chinaunix.net/uid-20180960-id-1972669.html

 

Linux平台Java调用so库-JNI使用例子
2010-08-11 22:17
 

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语言代码实现并返回的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTTP Header 详解
  • js 获取时区
  • 微信公众平台网页获取用户OpenID方法
  • Innodb行锁源码学习(一)
  • 我所了解的JavaScript糟粕和鸡肋
  • 得到的并不一定就值得庆幸,失去的也并不完全是坏事情
  • [转]iOS 应用程序的生命周期
  • javascript中==的数据类型转换规则
  • 深入了解java同步、锁紧机构
  • 自己的自定义单元格(IOS)
  • 第一部分:HTTP协议之请求和响应
  • 移动开发下Xamarin VS PhoneGap
  • c++中new分配动态数组
  • U盘安装ubuntu server 14.04
  • 【iOS】FMDB封装,查询自动mapping
  • 《剑指offer》分解让复杂问题更简单
  • 08.Android之View事件问题
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • HTTP那些事
  • Python打包系统简单入门
  • react-native 安卓真机环境搭建
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 漂亮刷新控件-iOS
  • 双管齐下,VMware的容器新战略
  • 小而合理的前端理论:rscss和rsjs
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 带你开发类似Pokemon Go的AR游戏
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​插件化DPI在商用WIFI中的价值
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #php的pecl工具#
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Note)C++中的继承方式
  • (python)数据结构---字典
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (SERIES12)DM性能优化
  • (void) (_x == _y)的作用
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (备份) esp32 GPIO
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (转)甲方乙方——赵民谈找工作
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .java 9 找不到符号_java找不到符号
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能