一、问题现象
在使用第三方生成的 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;
三、问题解决
问题找到了,就好解决了。
在src/main/java 目录下建立 和生成so包名一样的文件夹,
例如:使用生成so的包名是 com.cloud.jnitest ,那么就在使用so的工程src/main/java 新建 相同包名的文件。
在src/main/java /[so包名] 目录下建立 和生成so包名一样的类文件,
例如:使用生成so的类名是 JniTest ,那么就在使用so的工程src/main/java /[so包名] 新建 相同包名的类文件。
在src/main/java /[so包名] /类文件 ,中添加需要使用到的方法。
在使用 so的工程中 最终 效果:
啦啦啦 —— 今天夏至要吃面!所以 我今晚 下面给你吃呀 … 哈哈
参考链接: