转自: http://watershitter.iteye.com/blog/477615
今天花了至少3个小时跑这个java调c的动态链接库的Hello,native world的程序。 
把所有犯的错误和要点总结一下! 
1 java 中 c语言函数的声明 
    public native static void greeting(); //就像是接口声明一样,不过有native! 
2 编译 javac HelloNative.java ,然后使用 javah 
      javah HelloNative会自动产生c的头文件HelloNative.h3 生成的头文件 的 第一句子为 
  #include <jni.h> 
  但是gcc里面默认环境可不知道jni.h是什么东西,jni.h在jdk的$JAVA_HOME/include或者$JAVA_HOME/include/linux下面,可进去查看一下~

4 接下来就是根据HelloNative.h中声明的方法写C语言的实现,注意,自动生成的那个函数名字很长,并且 开头的  Java是大写的,大小写很致命,(最后我的程序在动态库已经加载好的情况下报错:java.lang.UnsatisfiedLinkError: HelloNative.greeting()V,就是因为c语言中的函数名字大小写写错,奇怪!编译不报错.....)

5 linux下编译生成动态库,注意不同环境的不一样~ 
  gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c 
  在这里,我犯的错:a,不理解 -I jdk -I 是include,显示指定库的库的地址,自然后面的jdk是要用你的设计地址替换的,b, 着急的去网上搜索问题,没有注意的在linux下,动态链接库的名字 必须是 lib****.so,必须以lib开头!

6 编译生成了 libHelloNative.h之后,接下写一个test类,如 HelloNativeTest, 
当然要调用System.loadLibrary("HelloNative");注意此时不要lib,也不要.so!; 
调用执行 HelloNative.greeting();这个时候错误又来了: 
java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path。这个错误很经典,原因:是java找不到库路径~: 
显然: libHelloNative.so放在当前路径 ".",只linux执行的时候却不知道在当前路径找。 linux很“傻”很“复杂”~

(java.lang.UnsatisfiedLinkError: no yourClassName in java.library.path的解决方法,推荐 2nd solution)
1) linux下面java.library.path 和环境变脸 jdk/bin的那个个PATH不是一回事情,有另外一个默认变量 LD_LIBRARY_PATH来保存他的信息。而windows下,首先java会找当前目录,其次,它会去环境变量的地址找!
2) 由于linux的路径特殊,所以,解决方法 1-可以调用sysout(System.getProperty("java.library.path"));来查看! 然后把 libXXXX.so拷贝到那里面的目录下去 
3) 设置环境变量 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH , 但是设置到哪里呢? /etc/profile ? or /root/.bashrc 不知道...忘记了linux的加载顺序了~ 
4) 可以单次执行时候指定library位置:   java -Djava.library.path=. HelloNativeTest

总结犯错:1不知道gcc编译时候指定库 2 不了解java.libray.path的特点,特别是砸linux下 3 c语言实现函数的时候拼写错误 4 排除问题不够理性,系统化,出现了烦躁情绪,导致效率低。 时刻明白,机器只是做你指定的事情,总是你自己出错了~~~

附:gcc 参数解释(转载): 
   最主要的是GCC命令行的一个选项: 
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

l -L.:表示要连接的库在当前目录中

l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

l 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。 
4、注意

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

java JNI调用C语言动态链接库(java.lang.UnsatisfiedLinkError: no yourClassName in java.library.path 异常的解决方法)相关推荐

  1. Java JNI调用C语言中的函数

    1.调用无参函数 java code public class JNITest {static {/*加载*/System.loadLibrary("mynative");}pub ...

  2. java调用c语言的动态库,hu-unix下面java调用c语言动态链接库.docx

    PAGE / NUMPAGES glddydyzcw HU-unix下面java调用C语言动态链接库我在Hp-unix下面用java JNI怎么调用C语言的动态链接库??System.loadLibr ...

  3. Java通过-jni调用c语言

    Java通过-jni调用c语言 一.编写JAVA程序 二.编译h头文件 三.编写C方法实现 四.生成对象文件 五.生成动态链接库 六.执行 一.编写JAVA程序 public class TestNa ...

  4. java 调用c效率高_java通过JNI调用C语言写的函数,能提高运行效率吗?

    C语言比Java快早就是公认的事实了.而Java可以通过JNI调用C语言写的库很多人也都知道. 但通过JNI调用C语言写的函数能提高效率吗?一直以来我都认为 是的 .昨晚心血来潮做了个测试,本意是想看 ...

  5. java JNI调用C++代码(给出一个简单java application示例和实际java web项目过程及错误解决)(一)

    一.简单java application示例篇 转载请注明:https://blog.csdn.net/xitie8523/article/details/79926948 本科毕业设计是图像分割相关 ...

  6. Java JNI调用IC卡读卡器

    Java JNI调用IC卡读卡器 Java调用IC卡读卡器的DLL一般有以下2种方式: 1.使用JNative第三方库调用IC卡读卡器dll的接口. 2.使用JNI调用IC卡读卡器dll的接口. JN ...

  7. java.lang.UnsatisfiedLinkError:no jhdf5 in java.library.path问题的解决

    笔者在MyEclipse中进行HDF文件的读写,遇到了java.lang.UnsatisfiedLinkError:no jhdf5 in java.library.path的问题.笔者详细地记录了整 ...

  8. java.lang.UnsatisfiedLinkError: no XXX in java.library.path

    其中涉及的测试源码如下: For those who didn't install Java with default settings, a systematic way for solving J ...

  9. IDEA springboot启动报错java.lang.UnsatisfiedLinkError: no tcnative-1 in java.library.path

    IDEA springboot启动报错: java.lang.UnsatisfiedLinkError: no tcnative-1 in java.library.path: [D:\Java\bi ...

最新文章

  1. CE6内核启动过程-新角度
  2. Matlab稀疏矩阵
  3. Windows驱动开发 - 派遣函数
  4. UI组件之ImageView及其子类(一)ImageView显示图片
  5. notepad++默认的快捷键整理
  6. java图形验证码生成工具类
  7. html5 can,基于html5 can-vas实现漫天飞雪效果实例
  8. python获取pc微信好友列表_python使用itchat获取微信好友列表
  9. 2017.3.30 寿司晚宴 失败总结
  10. linux 两块硬盘合并成一块
  11. SDKMAN 安装过程
  12. 微信群发消息注意事项
  13. 华东理工《文献检索》MOOC (3)---精通web of science检索结果分析、JCR数据库检索
  14. stata foreach循环语句的使用
  15. Arduino驱动LED128X64 - U8g2 自定义中文字库
  16. 超神之路-MySQL
  17. [Luogu P4168] [BZOJ 2724] [Violet]蒲公英
  18. 基于单片机的电话拨号系统设计(#0472)
  19. VM虚拟机故障安装不了虚拟网卡解决办法
  20. 群晖挂pt 路由器虚拟服务器设置,设置远程唤醒NAS要几步?用群晖路由只要4步!...

热门文章

  1. 【TC10738】TheContest【Hall 定理】【贪心】【二分图匹配】
  2. P2257 YY的GCD
  3. 计算几何模板中的代码
  4. Codeforces Round #712 (Div. 2)
  5. 【acwing210 异或运算】
  6. PAT 1152 Google Recruitment (20 分)- 甲级
  7. jzoj5702-[gdoi2018day2]滑稽子图【树形dp,二项式定理】
  8. P4294-[WC2008]游览计划【斯坦纳树】
  9. jzoj3914-人品问题【树形dp】
  10. ssl提高组周六模拟赛【2018.9.15】