文档章节

Linux下java调用c的动态库

光風霁月
 光風霁月
发布于 2016/06/05 20:40
字数 560
阅读 114
收藏 0

1.编写HelloJNI.java文件(包名为JNI)

package JNI;
public class HelloJNI
{
    static
    {
     System.load("/root/lib/goodluck.so");    //使用绝对路径加载名称为goodluck.so的库文件
       // System.loadLibrary("goodluck");    //使用默认路径加载
    }
    public native static int get();   //native关键字
    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());//如果成功,控制台会打印出10。
    }
}

2.编译HelloJNI.java文件成为.class文件

 javac -d . HelloJNI.java  //编译出带有包的class文件,以这个为例

 javac -d . HelloJNI.java //编译出不带包名的class文件

3.根据class文件生成.h头文件

注意:得在包名的起始位置进行编译点h头文件

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

#include "JNI_HelloJNI.h"
int i = 0;
JNIEXPORT jint JNICALL Java_JNI_HelloJNI_get(JNIEnv *env, jclass jc)
{
    return i;
}
JNIEXPORT void JNICALL Java_JNI_HelloJNI_set(JNIEnv *env, jclass jc, jint j)
{
    i = j;
}

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

 

gcc -fPIC -D_REENTRANT -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -c HelloJNI.c 

注:$JAVA_HOME/include 是jni.h头文件所在的路径
     $JAVA_HOME/include/linux是jni_md.h所在的路径

为了方便可以写成sh来执行

如果找不到jni.h和jni_md.h路径,根目录下执行 find -name jni.h    find -name jni_md.h  然后pwd查看,再全路径引用即可。

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

gcc -shared HelloJNI.o -o goodluck.so//用绝对路径load的话可以生成和load相同的文件名字

gcc -shared HelloJNI.o -o libgoodluck.so//使用loadLibrary(System.loadLibrary("goodluck");    使用默认路径加载)的话,需要默认以lib开头。

在Linux平台上,遵循JNI规范的动态链接库文件名必须以“lib”开头。例如在上面的Java程序中指定的库文件名为“goodluck”,则实际的库文件应该命名为“libgoodluck.so”。

7.将第6步中生成的goodluck.so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。

根目录下mkdir lib //新建lib文件夹

把goodluck.so文件拷贝到该目录下

注:也可以在别的地方新建目录,只要在java文件引用库能够load到。

8.执行class文件

 

 

 

 

 

 

 

 


 

© 著作权归作者所有

光風霁月
粉丝 3
博文 20
码字总数 22047
作品 0
昌平
程序员
私信 提问
java和c的本质--最重要的是启动

java很神秘吗?说什么跨平台,虚拟机之类的。c#很神秘吗?c很神秘吗?操作系统呢?cpu呢?其实这些都不神秘,以前不懂操作系统的时候,看见个多线程就跟看见个神似的,现在呢?linux内核随便...

晨曦之光
2012/04/10
562
0
Java并发(一) 之 Java调用native文件

转载备注地址: 1、初始化环境介绍 1.1 环境介绍 CentOS Linux release 7.3.1611 (Core)OpenJDK 1.8 1.2 环境配置 1.2.1 OpenJDK 安装 yum -y install java-1.8.0-openjdk java-1.8.0-openjdk......

来来来来来
07/08
194
0
windows平台开发,在eclipse中使用java如何调用.so文件,试了半天还是不行:

windows平台开发,在eclipse中使用java如何调用.so文件,试了半天还是不行: 1、java工程项目不是安卓项目,是web项目, 2、.so是linux下生成的动态库,.dll是windows下生成的动态库,网上几...

hhl3136
2017/11/21
2.8K
7
学习——>JNI设置C++与java的结合

JNI是Java Native Interface的英文缩写, 中文翻译为本地调用, 自从Java 1.1开始就成为了Java标准的一部分. C/C++是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身...

home-kevin
2014/01/07
589
0
安卓程序员,Linux,java,有趣的架构。

先来看常见的Linux系统架构,你可以参考Linux的架构 内核是系统的底层。Linux开机后,内核即启动,并存活于属于自己的内存空间,即内核空间(kernel space)。内核的一大功能是和硬件通信。内核...

android自学
2018/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀系统思路

业务分析 技术挑战 请求响应要快:无论成功失败,需要尽快返回给用户 架构设计   前端:静态化   站点层:限制请求数   服务层:乐观锁写缓存   数据库CAP:读写高可用,一致性,扩容...

雷开你的门
16分钟前
7
0
最全的教育行业大数据解决方案,个个针对痛点

大数据的悄然兴起也带动了教育行业的革新,移动教育、云课堂等的出现,使得教育行业再次成为了可以中长期保持高景气的行业。然而,初涉数据领域的教育行业同时也面临着相当大的难题,还需要更...

朕想上头条
20分钟前
5
0
预约模块设计分析

1.预约功能描述: 预约是小程序中常见的一种商品管理系统,商家可根据商品或服务的特性,灵活设置预约细节,为用户提供线上预约服务,如场地预约,商品预定等,实现高效经营。 预约场景: ...

鱼煎
23分钟前
4
0
阿里云日志服务构建网站实时分析大盘实战

场景分析 挖掘数据价值是当前企业级网站共同面临的问题。买买网是一个电商平台网站,每天拥有大量的用户访问和购买记录。为了引导用户直接消费,提升购买率和转化率,不同的用户类别需要推荐...

阿里云官方博客
24分钟前
2
0
TL665xF-EasyEVM开发板硬件处理器、NAND FLASH、RAM

广州创龙结合TI KeyStone系列多核架构TMS320C665x及Xilinx Artix-7系列FPGA设计的TL665xF-EasyEVM开发板是一款DSP+FPGA高速大数据采集处理平台,其底板采用沉金无铅工艺的6层板设计,适用于高...

Tronlong创龙
28分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部