zoukankan      html  css  js  c++  java
  • JNI java.lang.UnsatisfiedLinkError

    错误1: java.lang.Unsatisfie.lang.UnsatisfiedLinkError no XXXXX in java.library.path

    这个错误一般是找不到dll文件

    执行下这个 可以看看 System.out.println(System.getProperty("java.library.path")); 其实就是我们设置的path 环境变量里的东西或者有其他系统的设置。(在windows cmd下 输入path 或者 set 都可以看)。看了这个以后你就知道这个dll或者so文件放哪里他是可以找到了,当然最简单的放这个java文件所在的目录了或者他上层目录,一般是和java src目录同层目录就好了,你看下java.library.path 中有个点号(.) 就表明是当前工作目录的意思,所以肯定在工程目录下有个位置。这个错误一般比较好解决。


    错误2:java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

    这个错误是 在这个dll里找不到方法的声明,(搞了一下午害我差点装VC了,还借用到了dll查看工具)

    网上说是@符号的问题 ,解决方法是用gcc 编译的时候指定参数

    第1种方法:

    gcc -Wl,--kill-at -shared -o jnihello.dll Native.c

    这种方法生成不带@的函数声明

    第2种方法:
    gcc -Wl,--add-stdcall-alias -shared -o jnihello22.dll Native.c

    这种方法会生成2个函数声明,一个是带@的 一个是不带@的。

    第3种方法:

    在你的本地方法的头文件中中的函数前面加上下划线,比如以前是

    JNIEXPORT void JNICALL Java_TestNative_Hello (JNIEnv * , jobject );

    现在改成

    JNIEXPORT void JNICALL _Java_TestNative_Hello (JNIEnv * , jobject );

    同时你的实现的cpp文件或者c文件里的函数头也要一致 前面有下划线。

    如果你需要查看dll的导出函数声明可以用以下2个工具

    1: dllexp

    2:Anywhere PE Viewer

  • 相关阅读:
    jenkins中通过Publish Over SSH将项目部署到远程机器上
    GitHub 开源的 MySQL 在线更改 Schema 工具【转】
    MySQL ProxySQL读写分离实践
    MySQL ProxySQL读写分离使用初探
    LVS+Keepalived实现DBProxy的高可用
    Redis Codis 部署安装
    CS 和 BS 的区别和优缺点(转)
    Linux的SOCKET编程详解(转)
    数据结构-深度遍历和广度遍历(转)
    社保相关
  • 原文地址:https://www.cnblogs.com/yefengmeander/p/2887967.html
Copyright © 2011-2022 走看看