用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. 用CodeBlocks构建C项目时候出现的问题

    后缀名为depend的文件 是makefile 编译产生的文件 是生成一种依赖关系 帮助程序编译的   那为什么有时候会生成而有时候又不会呢?   看你makefile 自己的编写 写了就有 没写就没 ...

  2. mysql集群安装配置

    看网上很多人说mysql集群不是很稳定,因此这2天做了下mysql的集群,打算配置没有什么问题了,过2天做下相关的性能测试,我的配置环境如下:   操作系统:      Centos5.2    软件 ...

  3. leetcode Binary Tree Level Order Traversal python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  4. Linux学习之more命令

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...

  5. jQuery 源码分析和使用心得 - 文档遍历 ( traversing.js )

    jQuery之所以这么好用, 首先一点就是$()方法和它强大的选择器. 其中选择器使用的是sizzle引擎, sizzle是jQuery的子项目, 提供高效的选择器查询. 有个好消息告诉大家, 就是s ...

  6. JS输出日历

    页面HTML代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &l ...

  7. 随意记的一点 js 笔记

    1. 给未经声明的变量赋值在严格模式下会导致抛出 ReferenceError 错误(意思是,所有变量都必须用 var 去定义,不能在函数内部定义全局变量): 2. 在严格模式下,不能定义名为 eva ...

  8. background:url 的使用方法

    #pingfen li{ width:27px; float:left; height:28px; cursor:pointer; background:url( ; list-style:none; ...

  9. OpenCV学习 4:摄像头视频读写与边缘检测

    原创文章,欢迎转载,转载请注明出处 想实现人脸识别,车辆识别,车牌识别.一般我们可不是读硬盘里面的视频文件的,都是直接从摄像头读取视频流然后直接识别的.所以读取摄像头的视频流这是基础...OpenCV ...

  10. SQL Server 统计信息对查询的影响

    优化器根据开消确定选择哪个执行计划,开消又与行数统计信息有关,默认情况下统计信息是在优化的过程中自动生成的. 一旦列被标记为需要统计信息,查询优化器就会查找该列以有的统计信息,如果以有一个统计信息,下 ...