Linux下使用JNI的常见问题及解决方案
JNI是java和C/C++混合编程的接口,可以很方便地实现java调用C/C++语言。具体的使用方法,网上有很多教程,在此不做过多介绍。本博客只关注在使用JNI的过程中的常见问题。
1. 生成头文件用命令:javah*.class
这是错误的。运行上述命令会提示:java.lang.IllegalArgumentException: Not a valid class name:SegNative.class错误。错误原因和利用java命令运行程序一样,只需要指出前缀即可,无需给出.class后缀。
2. 版本问题
jdk6和jdk7中某些JNI方法稍有不同,注意转换。例如,C中获取字符串的方法GetStringUTFChars在两个jdk版本中就不同。老的jdk6版本使用方法为:
char* name=(char*)(*env)->GetStringUTFChars(env,Name,NULL);
而在jdk7中,方法调用变为:
const char* name=env->GetStringUTFChars(Name,0);
其他的版本问题及函数参数含义可以通过查看API获得更全面的资料。
3. 利用g++编译源文件找不到jni.h头文件
可以在编译时利用-I选项指定jni.h头文件所在目录:
g++ -I/usr/local/jdk1.7.0_25/include/ ……
4. 利用g++编译源文件找不到jni_md.h
这是因为在jni.h中引用了jni_md.h头文件,该头文件和jni.h不在一个目录下,所以我们还需要再指定jni_md.h的目录:
g++ -I/usr/local/jdk1.7.0_25/include/ -I/usr/local/jdk1.7.0_25/include/linux/……
可以看出jni_md.h放在和jni.h同级的目录linux下。
5. 不会生成动态链接库
生成动态链接库,需要在编译时声明-shared选项:
g++ -I /usr/local/jdk1.7.0_25/include/ -I /usr/local/jdk1.7.0_25/include/linux/SegNative.cpp –shared –o lib***.so
此外,我们也无需先生成相应的.o文件,直接指定动态链接库的名字即可。
6. 编译动态链接库报错:couldnot read symbols: Bad value
需要在编译的时候指定选项:-fPIC。
g++ -I /usr/local/jdk1.7.0_25/include/ -I /usr/local/jdk1.7.0_25/include/linux/SegNative.cpp –shared –o lib***.so -fPIC
7. 运行的时候找不到动态链接库
这个问题主要有两个原因:
- 生成的动态链接库名字不对:我们在java语言中声明的动态链接库如果名为A,则我们在编译时则需要将动态链接库的名字声明为libA.so,否则会报错。
- 路径不对,java找不到动态链接库。java会在特定的目录寻找动态链接库,可以通过打印java.library.path查看java会在哪些目录查找动态链接库:
System.out.println(System.getProperty("java.library.path"));
我的电脑打印结果为:
.:/opt/intel/impi/3.2.1.009/lib/:/usr/local/cuda/lib/:/root/NVIDIA_CUDA_SDK/lib/:/root/NVIDIA_CUDA_SDK/common/lib/:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
我们可以看到相关lib都包括在该路径下。特别注意一点是第一个路径是.,这表示java会在当前路径下寻找相关动态链接库。因而只要我们将动态链接库和.class文件放在一起就不会存在找不到动态链接库的问题。如果打印中不包括当前目录,我们可以通过修改LD_LIBRARY_PATH指定当前目录。
此外,我们也可以在运行的过程中指定:
java –Djava.library.path=”/home/savedlib/”executablefile
利用这种方法,程序可以指定不在当前目录的动态链接库。
Linux下使用JNI的常见问题及解决方案的更多相关文章
- 一些关于linux 下的jni下问题
编译的细节我就不写了,主要写一些linux下的注意事项,mask一下错误(太多windows的例子了) 编译教程:http://www.cnblogs.com/youxilua/archive/201 ...
- 【原创】Linux下编译链接中常见问题总结
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...
- linux下的命令和常见问题笔记
nginx的三大功能: 1.http服务 2.反向代理 3.负载均衡 2.当nginx重启报:[root@localhost logs]# service nginx reloadReloading ...
- Linux下Mysql安装与常见问题解决方案
1.Mysql安装 环境: Mysql版本: 开始安装: 首先检查环境有没有老版本mysql,有的话先卸载干净,具体百度. 接着先获取mysql的安装包:wget https://dev.mysql. ...
- linux下的视频音频播放器终极解决方案
要使用(启用)rpmfusion, 一定要先启用enable epel包: Important notes You need to enable EPEL on RHEL 5 & 6 or c ...
- 在Linux下开发多语言软件(gettext解决方案)
最近的项目出现了一个bug.项目是基于一个已有的成熟开源软件之上做修改的,新写了加解密库,用于为该成熟开源软件增添加解密功能.功能增加完成后效果都很好,可是就是中文出不来了,也就是说没办法自适应多语言 ...
- linux下mysql忘记root密码的解决方案
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...
- linux下SSH远程连接服务慢解决方案
1.适用命令及方案如下:[远程连接及执行命令]ssh -p22root@10.0.0.19ssh -p22 root@10.0.0.19 /sbin/ifconfig[远程拷贝:推送及拉取]scp - ...
- linux下Tomcat进程shutdown不完全--解决方案
Kill进程,修改tomcat bin目录下shutdown.sh和catalina.sh文件 忽略日志中的严重警告,因为这是关闭tomcat时候引起的,正常情况下不会发生这种内存泄露情况,而且Tom ...
随机推荐
- vsim生成VCD波形文件(verilog)
Vsim(ModelSim)生成VCD波形文件(verilog) 两种方法 方法一: 调用ModelSim自己的命令生成,仿真脚本中加入如下一句即可 vcd file mytb.vcd 方法二: 调用 ...
- 老生常谈的Javascript作用域问题
在前端学习中,作用域这个问题一直被广泛提起,什么是作用域,什么又是作用域链?在Javascript中,怎么去理解这些概念都是学好这门语言的关键,所以在学习前端开发的过程中,我需要也很有必要去学习和总结 ...
- 集合运算符之全集、交集、补集【weber出品必属精品】
集合的概念 与数学中的全集.交集.补集的概念是一样的 常用的集合运算符 集合运算符的作用:把两个查询构造为一个联合查询 1. 全集:求连个查询的全集 union all:将两个查询的所有数据全部列出, ...
- visifire 图表双坐标轴 silverlight
public void CreateChart(Grid oGrid, ObservableCollection<ListItem> lBaseOilBar) { ...
- 0129——UINavigationController
1.创建一个UINavigationController self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].boun ...
- o2o
o2o(电子商务名词) -- 百度名片 O2O即Online To Offline(在线离线/线上到线下),是指将线下的商务机会与互联网结合,让互联网成为线下交易的前台,这个概念最早来源于美国.O2O ...
- 1、Spark 通过api,hfile两种形式获取hbase数据,简单样例
pom内容: <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-se ...
- 洛谷 P1656 炸铁路
P1656 炸铁路 题目提供者kkksc03 标签图论搜索/枚举洛谷原创 难度普及/提高- 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵 ...
- 512M内存机器如何用好Mysql
购买阿里云512M内存ECS后,mysql有时候会自动关闭,停止运行 解决办法: a,优化mysql配置,因为自己安装的是mysql 5.6,而从5.6开始,mysql安装包中不再包含my-small ...
- 在java中生成二维码,并直接输出到jsp页面
在java中生成的二维码不存到磁盘里要直接输出到页面上,这就需要把生成的二维码直接以流的形式输出到页面上,我用的是myeclipse 和 tomcat 它的原理是:在加载页面时,根据img的src(c ...