Java在linux下调用C/C++生成的so文件
1.
CplusUtil.java是java web工程中的一个工具类
内容如下:
CplusUtil.java
package cn.undoner.utils; /**
* Created by ${<A HREF="mailto:undoner@gmail.com">undoner</A>} on 16-2-25.
*/
public class CplusUtil {
public native void sayHello(); static{
System.out.println(System.getProperty("java.library.path"));
System.load("/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so");
} public static void main(String[] args){
CplusUtil h = new CplusUtil();
h.sayHello();
}
}
2.
可通过IDE工具(Eclipse/IntellJ/javac等)编译整个工程,生成相应class文件
本文路经为:
/工程名/target/classes/cn/undoner/utils/CplusUtil.class
3.为utils所需调用的c函数生成相应.h头文件
注意:在有包名情况下,生成.h头文件要记得带上包名路径
javah -classpath classes -jni cn.undoner.utils.CplusUtil
生成文件:cn_undoner_utils_CplusUtil.h
内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_undoner_utils_CplusUtil */ #ifndef _Included_cn_undoner_utils_CplusUtil
#define _Included_cn_undoner_utils_CplusUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: cn_undoner_utils_CplusUtil
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
4.编写c函数
文件:MyJni.c
内容如下:
#include <jni.h>
#include "cn_undoner_utils_CplusUtil.h"
#include <stdio.h> JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello(JNIEnv *env,jobject obj){ printf("Hello JNI");
return;
}
5.
将.c文件编译成.o,再重新转换成.so或者.dll文件
gcc -fPIC -D_REENTRANT -I /usr/lib/jvm/java/include -I /usr/lib/jvm/java/include/linux -c MyJni.c
生成文件:MyJni.o
6.
将.o文件编译成.so文件
gcc -shared MyJni.o -o MyJni.so
生成文件:MyJni.so
7.
本文MyJni.so路径为:
/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so
8.
执行CplusUtil.class
在ide中运行CplusUtil或者直接java命令执行:
java cn.undoner.utils.CplusUtil
9.
结果:
/usr/lib/jvm/java/jre/lib/amd64/server:/usr/lib/jvm/java/jre/lib/amd64:/usr/lib/jvm/java/jre/../lib/amd64:/home/vobile/java_tool/idea-IU-141.178.9/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Hello JNI
注:System.getProperty("java.library.path")输出以下信息为本机的lib路径:
/usr/lib/jvm/java/jre/lib/amd64/server:/usr/lib/jvm/java/jre/lib/amd64:/usr/lib/jvm/java/jre/../lib/amd64:/home/vobile/java_tool/idea-IU-141.178.9/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Java在linux下调用C/C++生成的so文件的更多相关文章
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- Linux下c基于openssl生成MD5的函数
Linux下openssl提供了一系列哈希及加密的函数,如果调用openssl提供的MD5函数生成任意字符串的MD5呢?下面提供了一段代码实现Linux下c字符串生成md5的函数. 具体代码: 1 2 ...
- Linux下 解包/打包 Android 映像文件 system.img, boot.img, ramdisk.img, userdata.img.
Linux下 解包/打包 Android 映像文件 system.img, boot.img, ramdisk.img, userdata.img. 2014年10月20日 ⁄ 计算机视觉 ⁄ 共 1 ...
- LINUX学习笔记——LINUX下EXP命令全库备份数据库文件
LINUX下EXP命令全库备份数据库文件 1)建立备份目录,目录操作权限授权给Oracle用户 mkdir /backup --创建backup文件夹 cd / --进入cd语句 ls -l ...
- Linux 下三种提高工作效率的文件处理技巧
Linux 下三种提高工作效率的文件处理技巧 在 Linux 下工作,打交道最多的就是文件了,毕竟 Linux 下工作一切皆文件嘛.Linux 也为大家提供了多种用于处理文件的命令,合理使用这些命令可 ...
- 将linux下的rm命令改造成移动文件至回收站【转】
转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移 ...
- linux下怎么删除名称带空格的文件
linux下怎么删除名称带空格的文件-rm 'mysql bin.000005' 用引号把文件名括起来 某些情况下会出现名称带空格的文件, 如果想要删除的话,直接用rm mysql bin.00000 ...
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- 将linux下的rm命令改造成移动文件至回收站
将linux下的rm命令改造成移动文件至回收站 rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有 ...
随机推荐
- SPOJ VLATTICE(莫比乌斯反演)
题意: 在一个三维空间中,已知(0,0,0)和(n,n,n),求从原点可以看见多少个点 思路: 如果要能看见,即两点之间没有点,所以gcd(a,b,c) = 1 /*来自kuangbi ...
- poj3237 树链部分 边权模板
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7384 Accepted: 2001 Description ...
- bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5524 Solved: 2074[Submit] ...
- 存储单位的换算(KB, MB, GB)
关于存储单位的换算,大家一般会想到下面的换算方法. 1GB=1024MB 1MB=1024KB 1kb=1024字节 但实际生活中,这种换算方法并不准确. 例如在商家生产销售的硬盘, U盘中就不是这样 ...
- Object Relational Tutorial 对象关系教程
The SQLAlchemy Object Relational Mapper presents a method of associating user-defined Python classes ...
- beta 分布的详细介绍(转载)
目前看到的关于beta分布最好的一个解释,由于贴过来格式不好看,所以附上链接: http://www.datalearner.com/blog/1051505532393058
- webpack4新建一个项目
Create a new directory mkdir webpack-4-quickstart Initialize a package.json by running: npm init -y ...
- 解决ASP.NET MVC 检测到有潜在危险的 Request.Form 值
提交使用html编辑器编辑后的数据,由于Request时出现有HTML或JavaScript等字符串时,系统会认为是危险性值.立马报错. "从客户端 ... 中检测到有潜在危险的 Reque ...
- 【事务】<查询不到同一调用方法其它事务提交的更新>解决方案
最近遇到一个很棘手的问题,至今也解释不清楚原因,不过已经找到了解决方案. 先来看看Propagation属性的值含义,@Transactional中Propagation属性有7个选项可供选择: Pr ...
- 【java集合系列】--- LinkedList
开篇前言--LinkedList中的基本用法 在前面的博文中,小编介绍List接口中的ArrayList集合,List这个接口,有两个实现类,一个就是ArrayList另一个是LinkedList(链 ...