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

一、问题现象

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

UnsatisfiedLinkError: No implementation found for

java.lang.UnsatisfiedLinkError: No implementation found for

java.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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值