17、java.lang.UnsatisfiedLinkError: No implementation 处理方法

来源:互联网 发布:linux部署nodejs项目 编辑:程序博客网 时间:2024/06/10 11:52

一、问题现象

在使用第三方生成的 so 库时,遇到下面的bug:

UnsatisfiedLinkError: No implementation found for

java.lang.UnsatisfiedLinkError: No implementation found forjava.lang.String com.cloud.wd.tralanguage.JniUtil.getStringFromC() (tried Java_com_cloud_wd_tralanguage_JniUtil_getStringFromC and Java_com_cloud_wd_tralanguage_JniUtil_getStringFromC__)

如图:
这里写图片描述

二、问题分析

按照bug log提示内容说是我 getStringFromC 方法并没有实现:

这里写图片描述

而我引用的是第三方的so这个方法已经实现了,既然实现了 为什么还会提示需要实现呢?

原来仔细观察得知 :提示让我实现 我自己写的 native 方法:

com.cloud.wd.tralanguage.JniUtil.getStringFromC(),压根没有引用到我添加的so中的方法, 问题找到了那么如何引用 正确的so呢?

经过一番的 google 发现:再使用第三方so 方法时, 所使用的native 类的位置要和之前生成 so 方法的 包名 、类名 、方法名 要完全一致!

例如:生成so工程的 native 方法类 ,

包名:  com.cloud.jnitest   类名:  JniTest方法名:getStringFromC ()

这里写图片描述

则 要想使用 so中的getStringFromC () 方法; 就需要

使用的so工程中添加:

包名:  com.cloud.jnitest   类名:  JniTest方法名:getStringFromC ()

这里写图片描述

只用 两者的包名 、类名、方法名 完全一致才会正确的引用到需要加载的so;

三、问题解决

问题找到了,就好解决了。

  1. 在src/main/java 目录下建立 和生成so包名一样的文件夹,

    例如:使用生成so的包名是 com.cloud.jnitest ,那么就在使用so的工程src/main/java 新建 相同包名的文件。

  2. 在src/main/java /[so包名] 目录下建立 和生成so包名一样的类文件,

    例如:使用生成so的类名是 JniTest ,那么就在使用so的工程src/main/java /[so包名] 新建 相同包名的类文件。

  3. 在src/main/java /[so包名] /类文件 ,中添加需要使用到的方法。

    在使用 so的工程中 最终 效果:

    这里写图片描述


啦啦啦 —— 今天夏至要吃面!所以 我今晚 下面给你吃呀 … 哈哈


参考链接:

http://m.blog.csdn.net/u012721933/article/details/51016027

http://blog.csdn.net/ouyang_peng/article/details/52997698

阅读全文
0 0