JNI学习&使用过程中的错误
Part 1
Ubuntu下JNI的简单使用:
http://blog.csdn.net/fengqiaoyebo2008/article/details/6210499
Part 2
在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译:
http://www.oschina.net/question/1402563_133543
Part 3
JNI java.lang.UnsatisfiedLinkError解决方法:
http://dikar.iteye.com/blog/382701
JNI java.lang.UnsatisfiedLinkError解决方法:
http://www.360doc.com/content/09/0402/09/107226_2994393.shtml
Java调用本地C/C++动态库拾遗 JNI/JNA与名称粉碎:
http://blog.sina.com.cn/s/blog_3f2c72ea01011kvx.html
JNI调用本地方法 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常:
http://www.cnblogs.com/javawebsoa/archive/2013/07/30/3225942.html
|
生成头文件的shell: hadoop@Node4:/usr/local/eclipse/workspace/MongoLoc/bin$ javah -jni tong.mongo.loction.LinkedC 编 译C程序的shell: g++ -shared -I /usr/local/bin/jdk1.7.0_71/include -I /usr/local/bin/jdk1.7.0_71/include/linux main.cpp -o libSpeedEstimate.so |
0. 错误 :
java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()
解决:
之前在windows系统下运行需要在本地方法的头文件中中的函数前面加上下划线,比如以前是 JNIEXPORT void JNICALL Java_TestNative_Hello (JNIEnv * , jobject ); 现在改成 JNIEXPORT void JNICALL _Java_TestNative_Hello (JNIEnv * , jobject ); 同时你的实现的cpp文件或者c文件里的函数头也要一致 前面有下划线。
但是移植到ubuntu下,出现此错误。去掉加的下划线后又可以运行。
1.错误:
运行程序,在eclipse控制台出现
Java HotSpot(TM) Server VM warning: You have loaded library /usr/local/eclipse/workspace/MongoLoc/libSpeedEstimate.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/eclipse/workspace/MongoLoc/libSpeedEstimate.so: /usr/local/eclipse/workspace/MongoLoc/libSpeedEstimate.so: 错误 ELF 类: ELFCLASS64 (Possible cause: architecture word width mismatch)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1880)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at tong.mongo.loction.LinkedC.<clinit>(LinkedC.java:10)
at tong.mongo.loction.MdbFind.main(MdbFind.java:173)
原因:
原因是编译使用的jvm是64位的,我们的系统jVM是32位的版本。c程序在64位系统下编译,不能在32位下用。
解决:
c程序重新在32位系统编译
2. 错误:
在命令窗口输入 gcc -shared -I /usr/local/bin/jdk1.7.0_71/include/ -I /usr/local/bin/jdk1.7.0_71/include/linux/ main.cpp -o libSpeedEstimate.so
进行编译
gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
原因:
gcc 跟 g++ 版本不一致,或者没有安装g++
解决:
$sudo apt-get install g++
3. 错误:运行程序出现 libSpeedEstimate.so: undefined symbol: _ZNSt8ios_base4InitC1Ev
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/eclipse/workspace/MongoLoc/libSpeedEstimate.so: /usr/local/eclipse/workspace/MongoLoc/libSpeedEstimate.so: undefined symbol: _ZNSt8ios_base4InitC1Ev
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1880)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at tong.mongo.loction.LinkedC.<clinit>(LinkedC.java:10)
at tong.mongo.loction.MdbFind.main(MdbFind.java:173)
原因:
译有问题,用g++ 编译可以,可能是有个cpp文件,gcc虽然能编译,但是生成的so文件格式有些问题,jni找不到接口,用g++就可以
原来的命令:
gcc -shared -I /usr/local/bin/jdk1.7.0_71/include/ -I /usr/local/bin/jdk1.7.0_71/include/linux/ main.cpp -o libSpeedEstimate.so
修改:
g++ -shared -I /usr/local/bin/jdk1.7.0_71/include/ -I /usr/local/bin/jdk1.7.0_71/include/linux/ main.cpp -o libSpeedEstimate.so
然后重新运行程序
见连接:http://bbs.csdn.net/topics/290013271
JNI学习&使用过程中的错误的更多相关文章
- 学习MySQL过程中的随笔二
MySQL深入学习: 视图 使用视图的目的:多次使用同一张临时表(或者已经存在的表) 视图只是一个虚拟表,其本质为[根据SQL语句获取动态的数据集,并为其命名],用户只需使用别名即可获得实时的 ...
- 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误
SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- mysql安装过程中出现错误ERROR 1820 (HY000): You must SET PASSWORD before executing this statement解决
mysql安装过程中出现错误ERROR 1820 (HY000): You must SET PASSWORD before executing this statement解决 最近新装好的my ...
- 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题
我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...
- 关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录)
关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录) 作者:王可利(Star·星星) HTML中 相对定位:position:relative; 绝对定位:position ...
- 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)
利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录) 作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...
- html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)
html/css 盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width 是"宽 ...
- CAS SSO:汇集配置过程中的错误解决方法
本教程为gevin.me原创文章,转载请注明: CAS SSO:配置过程中的错误解决方法 | Gevin’s Blog 本文将收集在配置CAS SSO遇到的所有错误,希望对大家有帮助,也方便下次搭建的 ...
随机推荐
- git仓库迁移和更新远程仓库地址
一.git仓库迁移 1,从原仓库clone或pull到本地仓库 git clone project_name [old_remote_repository_address] 2,在新的git创建一 ...
- kill,killall,top,free,vmstat,iostat,watch命令
kill命令 Linux 中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以 使用Ctrl+C键,但是,对 ...
- Linux企业级项目实践之网络爬虫(27)——多路IO复用
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程. 主要应用: (1)客户程序需要同时处理交互式的输入和服务器之间的网络连接 (2) ...
- DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数
以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...
- C#系列教程——switch定义及使用
代码如下: using System; class Switch_Test { static void Main() { Console.WriteLine("box sizes: 1=Sm ...
- java笔记4之比较运算符
/* 比较运算符: ==,!=,>,>=,<,<= 特点: 无论你的操作是简单还是复杂,结果是boolean类型. ...
- JS(五)
感觉JS里面还是有很多小技巧的,知道套路了,其实实现起来其实也还没有想象中的那么复杂.不过我觉得还是要把所学的知识融会贯通吧,不能学了JS就忘了前面的知识,结合起来才会威力无穷. 1.跑马灯:弹弹弹 ...
- 【初学者常见问题】一脚踏入protected埋下的陷阱
受保护的(protected)——声明该成员的类的子类可以访问这个类的成员(但有一定的限制),并且,声明该成员的包内部的任何类也可以访问这个成员 protected修饰符参考:http://www.3 ...
- android 多项对话框
在main.xml中 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
- [Typescript] Typescript Enums vs Booleans when Handling State
Handling state with Typescript enums, instead of booleans, is preferred because:- Enums are more rea ...