用jni调用库函数时,经常会碰到link的错误,具体出错信息如下:
08-07 01:42:06.490: E/AndroidRuntime(1665): java.lang.UnsatisfiedLinkError: xxxx

核对后发现函数名称并没有错。

这个问题有几种可能,最根本的解决方法是把so的内容dump出来。具体的方法可以参考 http://stackoverflow.com/questions/34732/how-do-i-list-the-symbols-in-a-so-file

我的文件是elf格式,执行如下的命令:

readelf -Ws xxxx.so >> test.log

so这个库导出的函数就在test.log里了,你可以在log找找看,如果没发现你要导出的函数,
大概有两种可能,第一个是JNIEXPORT没起到作用,第二个是你的函数名或者路径由错误。

附上我的test.log

Symbol table '.dynsym' contains 79 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000fa8     0 SECTION LOCAL  DEFAULT    7
     2: 0000aaa0     0 SECTION LOCAL  DEFAULT   15
     3: 00002278    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_ForcedUnwind
     4: 00001c7c   164 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_RaiseException
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND ioctl
     6: 00000fdd    60 FUNC    GLOBAL DEFAULT    7 Java_com_android_ralmes_GlobalProcess_read
     7: 00001065    56 FUNC    GLOBAL DEFAULT    7 Java_com_android_ralmes_GlobalProcess_isGpioTriggerDeviceExist
     8: 00001019    76 FUNC    GLOBAL DEFAULT    7 Java_com_android_ralmes_GlobalProcess_write
     9: 00002134     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP
    10: 00002254    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume_or_Rethrow
    11: 0000293c     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
    12: 00000000     0 OBJECT  GLOBAL DEFAULT  UND __stack_chk_guard
    13: 000017d4     8 FUNC    GLOBAL DEFAULT    7 __aeabi_unwind_cpp_pr0
    14: 00002360    44 FUNC    GLOBAL DEFAULT    7 _Unwind_GetRegionStart
    15: 00002254    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume_or_Rethrow
    16: 0000aab0     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
    17: 0000229c    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Backtrace
    18: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_begin_cleanup
    19: 00002118    20 FUNC    GLOBAL DEFAULT    7 __restore_core_regs
    20: 00002154     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D_16_to_31
    21: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_call_unexpected
    22: 00001304     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetCFA
    23: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy
    24: 000012a0    76 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Set
    25: 00000000     0 FUNC    GLOBAL DEFAULT  UND __cxa_finalize
    26: 0000a944     0 NOTYPE  GLOBAL DEFAULT   12 __FINI_ARRAY__
    27: 000011f1   100 FUNC    GLOBAL DEFAULT    7 Java_com_android_ralmes_GlobalProcess_openGpioM0
    28: 0000aaa0     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
    29: 00001a18   212 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Backtrace
    30: 0000aaa0     4 OBJECT  GLOBAL DEFAULT   15 __dso_handle
    31: 00002144     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_VFP_D
    32: 00000000     0 FUNC    GLOBAL DEFAULT  UND __android_log_print
    33: 00001dac   876 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Pop
    34: 000017c4     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr2
    35: 0000229c    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Backtrace
    36: 0000285c     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
    37: 0000220c    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_RaiseException
    38: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort
    39: 00002230    36 FUNC    GLOBAL DEFAULT    7 ___Unwind_Resume
    40: 00000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail
    41: 00000fb9    36 FUNC    GLOBAL DEFAULT    7 _Z43Java_com_android_ralems_GlobalProcess_closeP7_JNIEnvP7_jclassi
    42: 0000215c     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMXD
    43: 00001189   104 FUNC    GLOBAL DEFAULT    7 Java_com_android_ralmes_GlobalProcess_closeGpioM0
    44: 00000000     0 FUNC    GLOBAL DEFAULT  UND write
    45: 0000212c     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP
    46: 00002230    36 FUNC    GLOBAL DEFAULT    7 _Unwind_Resume
    47: 00001310    32 FUNC    GLOBAL DEFAULT    7 _Unwind_DeleteException
    48: 0000130c     4 FUNC    GLOBAL DEFAULT    7 _Unwind_Complete
    49: 0000aab0     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
    50: 0000109d   236 FUNC    GLOBAL DEFAULT    7 Java_com_android_ralmes_GlobalProcess_openSerialPort
    51: 0000a93c     0 NOTYPE  GLOBAL DEFAULT   11 __INIT_ARRAY__
    52: 00000000     0 FUNC    GLOBAL DEFAULT  UND read
    53: 0000238c   888 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_execute
    54: 0000213c     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_D
    55: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_type_match
    56: 00001d40   108 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume
    57: 0000214c     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_VFP_D_16_to_31
    58: 0000220c    36 FUNC    GLOBAL DEFAULT    7 _Unwind_RaiseException
    59: 0000aaa0     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    60: 0000aab0     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    61: 00001c08    28 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_ForcedUnwind
    62: 00001d20    32 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Resume_or_Rethrow
    63: 00000000     0 FUNC    WEAK   DEFAULT  UND __gnu_Unwind_Find_exidx
    64: 00002118    20 FUNC    GLOBAL DEFAULT    7 restore_core_regs
    65: 000021f8     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXC
    66: 00002318     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetTextRelBase
    67: 00002328    56 FUNC    GLOBAL DEFAULT    7 _Unwind_GetLanguageSpecificData
    68: 00001254    76 FUNC    GLOBAL DEFAULT    7 _Unwind_VRS_Get
    69: 000021e4     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Restore_WMMXC
    70: 00002704    64 FUNC    GLOBAL DEFAULT    7 __gnu_unwind_frame
    71: 00002278    36 FUNC    GLOBAL DEFAULT    7 _Unwind_ForcedUnwind
    72: 0000aaa0     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    73: 0000aab0     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    74: 000021a0     0 FUNC    GLOBAL DEFAULT    7 __gnu_Unwind_Save_WMMXD
    75: 000017cc     8 FUNC    WEAK   DEFAULT    7 __aeabi_unwind_cpp_pr1
    76: 00000000     0 FUNC    GLOBAL DEFAULT  UND open
    77: 00002320     8 FUNC    GLOBAL DEFAULT    7 _Unwind_GetDataRelBase
    78: 00000000     0 FUNC    GLOBAL DEFAULT  UND close

我要导出一个叫close的函数,但是第41行的内容如下:
41: 00000fb9    36 FUNC    GLOBAL DEFAULT    7 _Z43Java_com_android_ralems_GlobalProcess_closeP7_JNIEnvP7_jclassi

可以看到,导出的函数名不规则,而且ralmes错写成了ralems,
发现问题后立刻就解决了。

解决jni链接时找不到函数的问题的更多相关文章

  1. ios 引入第三方库 运行时找不到函数实现

    今天引入webtrends 这个库,结果一直运行时找不到函数,纳闷了一下午! 后来发现,是other flag没有设置对,对于那些包含category用来扩展ios原始类型的库,链接的时候需要特别的链 ...

  2. [DNX]解决dnu restore时找不到Newtonsoft.Json的问题

    在Mac上用最新版的dnx 1.0.0-beta5-11855进行dnu restore,出现下面的错误: System.IO.FileNotFoundException: Could not loa ...

  3. ubuntu 下 数学库编译链接时找不到各种数学问题解决方法 can not fon atan 等等

    解决参考 http://askubuntu.com/questions/190246/ld-cannot-find-math-library you should use -lm at the end ...

  4. 解决eclipse配置Tomcat时找不到server选项(Mac通用)

    集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境( ...

  5. 解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题

    解决远程桌面链接时出现"The RPC server is unavailable."或"RPC服务器不可用"的问题 解决远程桌面链接时出现"The ...

  6. 解决eclipse配置Tomcat时找不到server选项

    集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境( ...

  7. 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法

    关键设置: 第一步(SQL2005.SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Serv ...

  8. 在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法。

    在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法. 先确定 libclntsh.so.11.1 所在目录: [oracle@localhost ~] ...

  9. java:解决eclipse配置Tomcat时找不到server选项

    http://blog.csdn.net/wugangsunny/article/details/25246565 集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在 ...

随机推荐

  1. centos防火墙端口配置

    增加防火墙配置,允许8080端口: # vi /etc/sysconfig/iptables 在允许ssh的下面增加一条: -A INPUT -m state --state NEW -m tcp - ...

  2. android监听键盘

    android中的带有输入功能的页面布局经常被弹出的键盘遮挡,一种处理方法是监听键盘的弹出,设置布局的padding或隐藏某些占位控件,使得输入框不被键盘遮挡.一种常用的方法是当Activity设置为 ...

  3. 关于FND_PROFILE与FND_GLOBLE[Z]

    fnd_global package可以取得一些關於當前login in用戶的信息 fnd_concurrent_requests functions   select FND_PROFILE.VAL ...

  4. UIPasteboard 粘贴板

    UIPasteboard *pasteboard = pasteboard.string = self.label.text;

  5. Python核心编程读笔 10:函数和函数式编程

    第11章 函数和函数式编程 一 调用函数  1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...

  6. 小鱼提问3 static方法中可以访问某个类的私有变量吗(不通过反射的其他非正常手段)?什么情况下可以?

    class Student { private string _name; public int Age = 0; public static void Test() { Student stu = ...

  7. [一道搜狗输入法的面试题]C++转换构造函数和类型转换函数

    今天面试遇到一道有关C++转换构造函数的题目,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,学习之路很长啊! 其实我们已 ...

  8. Java提高学习之Object(2)

    Equality 问:euqals()函数是用来做什么的? 答:equals()函数可以用来检查一个对象与调用这个equals()的这个对象是否相等. 问:为什么不用“==”运算符来判断两个对象是否相 ...

  9. Linux网络管理——Linux网络命令

    3. Linux网络命令 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  10. PHP MySql数据库访问

    PHP MySql数据库访问 计应134   凌豪 1.MySql数据库的连接 要操作MySql数据库,首先必须与MySQl数据库建立连接,连接MySQL服务器的语句如下: <?php$link ...