守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1410|回复: 0

[Android] ANE Android Java 接口部分引用第三方JAR的解决办法

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51792
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-11 22:45:38 | 显示全部楼层 |阅读模式
    几天在做Android AIR 游戏时,集成国外支付平台的接口时候遇到了这样的问题。

    详细描述:
    平台的支付SDK已经打好了Jar包,直接面向原生Java开发者提供接口。结果我们的游戏需要在AIR内嵌入这个接口,肯定需要ANE的支持,写一个ANE实际上很简单,但是问题是在Debug的时候各种报错找不到SDK的类。

    1. 11-14 09:55:48.360: I/dalvikvm(7296): Failed resolving Lcom/chocobots/QiipIAB/QiipIABListener; interface 80 'Lcom/qiip/iab/IABListener;'
    2. 11-14 09:55:48.360: W/dalvikvm(7296): Link of class 'Lcom/chocobots/QiipIAB/QiipIABListener;' failed
    3. 11-14 09:55:48.360: E/dalvikvm(7296): Could not find class 'com.chocobots.QiipIAB.QiipIABListener', referenced from method com.chocobots.QiipIAB.QiipIABContext.initIAB
    4. 11-14 09:55:48.360: W/dalvikvm(7296): VFY: unable to resolve new-instance 72 (Lcom/chocobots/QiipIAB/QiipIABListener;) in Lcom/chocobots/QiipIAB/QiipIABContext;
    复制代码

    苦苦调试之后才发现无论怎样Import那个SDK都是无济于事的。虽然有幸搜索到了天地会某位大哥的帖子,但是那只是针对ANE调用外部一些资源的解决方式,对于第三方JAR包的调用一直没有很好的答案,最后在国外的帖子里面找到了答案:

    ANE 不支持多个JAR包的调用,只有你自己导出的JAR包可以被编译到项目内,其他的JAR包如果以引用的方式被调用,最终是不会导入到APK内的。

    解决方案:

    将你的Java接口生成的Jar包与你调用的第三方Jar包合并。


    合并的方式实际上非常的简单。


    1.用 jar -xf 命令解压第三方Jar包
    2.用 jar -uf 命令合并第三方Jar包
    3.注意,在合并的时候实际上是有命令参数的。鉴于我对于jar命令不怎么熟悉,为了让最终的Jar包比较干净,我用比较笨的方法一个个顶级包进行合并。也就是说如果你要引用的第三方包只有com这个顶级包,那只要一条语句就搞定了。


    对于和我同样不熟悉这个命令朋友,我做了一个简单的BAT脚本,你只要:


    1.新建一个不包含中文的路径的文件夹
    2.将你已经导出的主JAR包和需要扩展的第三方JAR包粘进去
    3.在这个文件夹内新建一个txt文件将下面的命令粘进去
    1. @echo off
    2. ::转到当前盘符
    3. %~d0
    4. ::打开当前目录
    5. cd %~dp0
    6. ::你做的主JAR包的路径
    7. set MainJar=MYANEJavaLib.jar
    8. ::第三方JAR包的路径
    9. set ExternalJar=3rdApiLib.jar
    10. ::第三方JAR包顶级包名称
    11. set packageName=com
    12. echo =========== start combin ==============
    13. ::解压第三方包
    14. jar -xf %ExternalJar%
    15. ::合并主JAR包
    16. jar -uf %MainJar% %packageName%
    17. ::如果还有别的顶级包可以接着合并,例如:
    18. ::jar -uf %MainJar% %packageName2%
    19. ::jar -uf %MainJar% org
    20. ::jar -uf %MainJar% cn
    21. echo =========== over ==============
    22. echo 再点一下就结束了--小Q
    23. pause
    复制代码
    4.修改参数MainJar等号后面的内容为你自己导出的JAR包
    5.修改参数ExternalJar等号后面的内容为第三方JAR包
    6.修改参数packageName等号后面的内容你要合并的包名
    7.如果还需要合并其他的顶级包,可以修改我下面的注释(只要去掉::就可以了)
    8.将这个txt改名为bat,并运行它。


    如果不放心结果,合并结束后观察一下包的大小,或者将包改名为ZIP,并解压,看看里面是不是所有类都齐全了。
    基本上就是这样了,不知道遇到和我一样问题的人多不多。希望可以给大家有帮助,有问题可以随时联系我,大家一起探讨。
    写好的BAT文件


    ==========================以下是一些附加问题的汇总===========================

    1. 有很多朋友提到,第三方工具除了包含JAR包外,还包含一些图片或者layout配置的“内部资源”。这些资源文件常见于项目res等文件夹下。经常出现的问题就是当我们将第三方JAR包同自己的JAR包合并后,运行的时候往往因为找不到上述的一些“内部资源”而出现报错和崩溃。

    解决方法:

    如果是FB项目的话,最简单的方法就是将这些文件及文件夹拷贝到你的应用项目(注意,不是你的ANE项目)内的src目录下,这样,在你的应用打包的过程中自然会将这些文件一同打包到APK文件内,ANE在调用的时候就可以当便的找到它们了。

    如果是FD项目,需要修改打包脚本,找到bat/Packager.bat, 找到“:start”标签,将下面的命令改为:
    1. call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir {额外的资源文件夹}
    复制代码
    {额外的资源文件夹}替换为资源文件的路径即可。


    2.  如何定位一些诸如崩溃,找不到对象,对象为空的问题。这个嘛,作为Android应用开发者应该都要了解,实际上如果你借助Eclipse开发Android应用,理论上应该安装了ADT插件了。如果没有的话可以参照这个文章:
    http://blog.csdn.net/greenappple/article/details/6170478

    假设你已经成功的安装了ADT,并且你的android-sdk也更新到了相应的版本(注意,ADT和SDK的版本必须是一致的,否则打开Android的设置会报错,提醒你更新其中之一)。切换到Debug模式,将会有一个logCat窗口,这个窗口将会实时打印所有的系统log。将你的设备USBDebug模式打开,链接设备和电脑,正常的状况就会看到log源源不断的刷出来。

    小提示:由于logCat默认是将所有的信息打印出来,不方便我们有针对性的调试,所以最好使用过滤的方式监视特定的标签或者pid的log。你可以在左侧栏内使用“+”建立自定义的过滤器。另外在你编写java代码的时候,调用Log.d方法时,也同样可以添加一个自定的Tag。



    3. 有很多国内的朋友在开发支付宝, 爱贝或者别的支付插件的时候, 经常会遇到即使合并了版本, 在运行一些SDKAPI 初始化方法的时候就会报错的问题. 造成这种问题的原因很, 以下的方法不保证能够完全解决你遇到的问题. 但是可以带给你一些解决问题的思路. 这里要特别感谢论坛的兄弟 红毛 帮我解决了这个问题!!
    在一些第三方的SDk内经常配备有SO文件, 这是用C语言编写的运行库, 在打包ANE的时候需要将这些SO文件编译进ANE才可以正常的进行某些接口的调用. 你可以在你获得第三方SDK的示例项目内查找一下,看看有没有如下的文件:




    如果这个示例项目的lib里有文件夹,如armeabi,那么在打包ane的时候,要将这些文件放在Android-ARM\libs下
    例如的放置路径是:
    1. Android-ARM/libs/armeabi/*.*
    2. Android-ARM/libs/armeabi-v7a/*.*
    复制代码
    然后再进行ANE打包, 应该可以解决大部分SDKAPI启动不正常的问题.



    本文来自:http://bbs.9ria.com/thread-160445-1-1.html


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-20 18:32 , Processed in 0.045923 second(s), 36 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表