当前位置: 首页 > 知识库问答 >
问题:

xamarin.Android绑定到第三方SDK

段兴为
2023-03-14
  • “2”->com.android.support:support-v4:25.1.1
  • “3”->com.google.android.gms:play-services-位置:10.2.0
  • “4”->com.google.android.gms:play-services-gcm:10.2.0

在这个场景中,如果我需要创建绑定dll来包装依赖于其他3个AAR的父AAR:

我是否应该(A)创建4个绑定程序集--父绑定程序集bind_aar_1.dll,它依赖于bind_aar_2.dll、bind_aar_3.dll和bind_aar_4.dll?

或者,我应该(B)深入研究2、3和4个AAR文件,从每个文件中获取JAR文件,并使用'embeddedjar'(或其他属性/设置)将它们直接包含在Jars文件夹中的bind_aar_1.dll中?

或者,看到2、3和4实际上是通过NuGet获得的,我是否应该(C)使用NuGet将它们引用到Bind_AAR_1项目中?如果我使用NuGet引用/包含AAR1中的Javacode是否能够看到AAR2,3和4中的代码?

我已经尝试了方法(A)、(B)和(C)中的每一个变体,但还没有运气,也没有结果导致更多的工作,这让我想知道什么是最好的/正确的方法来做这件事。

关于一个相关主题,使用metadata.xml文件显式地从生成的包装器API中删除您不打算直接在Xamarin项目中使用的所有内容(类等)是否是最佳实践?似乎限制接口并减少绑定DLL的构建大小(以及可能的构建时间)是很好的。

任何帮助都将不胜感激!

柯蒂斯

=========================================================================================

实际上,当我用Visual Studio将SDK(单独使用或使用3种方法中的任何一种)包装成Xamarin Android绑定程序集时,在运行时SDK会出现ClassNotFound异常(日志中的“Google Play not Found.”证明了这一点)。从所需的Java依赖项中使用的类是以后期绑定的方式创建的,使用类名的名称字符串如下所示:try{class.forname(“com.google.android.gms.common.googleplayServiceSutil”);
//more code here}catch(ClassNotFoundException e){log.e(“第三方SDK”,“Google Play not found.”);}
如何在Visual Studio中使用上面的3种方法构建绑定程序集以包括依赖项(1个绑定中有1个AAR+3个Nuget或1个AAR+3个JAR,在运行时,SDK似乎看不到它们。也许这是有意义的,它不会-没有。gradle(像csproj文件)在SDK本身中指向它们?

我认为我需要做的是(更接近于供应商的说明)创建一个Java解决方案,其中包含一个。gradle文件,该文件包括SDK以及Java项目中的3个依赖项,构建创建一个AAR文件。然后,我相信我可以为最终的包含AAR创建一个Xamarin绑定程序集。然后,我将向解决方案中的。Andriod程序集中添加一个对此绑定程序集的引用,然后继续。

理论(有待证实):[失败。见下文4/12更新。]将Java SDK+其编码的依赖项(在.gradle中显式)封装在模块/库中,然后将其封装在Xamarin Android绑定库中。然后,我需要做的就是找出需要从这个包装器模块/库中使用(因此公开)哪些公共方法,添加这些公共方法,并将调用转发到SDK。

大局观:我试图将其设计和编码为一个跨平台的Xamarin解决方案,但我正在使用特定于Android和特定于iOS的SDK,这两个SDK似乎都是应用程序/UI体验的一部分(设计目的不仅仅是处理与第三方的通信)。这个UI方面还没有发挥出来,因为我还没有看到任何SDK功能。

=========================================================================================

4/12/2017-更新

理论(失败):将Java SDK+其编码的依赖项(在.gradle中显式)封装在模块/库中,然后将其封装在Xamarin Android绑定库中。我们对此进行编码、构建、部署和测试。我现在看到应用程序在运行时进入了Java代码的第一层,但没有找到任何低于该层的引用代码(也就是依赖项)。包装器的代码运行良好,但在运行时包装器找不到SDK的类,甚至找不到我们试图通过包装器使用的简单Java测试组件。这相当于我们最初在SDK中遇到的问题,当时我们只为它创建了一个绑定文件,并通过JAR或NuGet将其馀部分引用到绑定程序集中。仍然找不到较低级别的代码,只执行java的第一层。还在想办法。

=========================================================================================

4/13/2017-更新

我取得了一些进步。向前一步,也许就像他们说的那样后退两步。

我现在意识到第三方SDK需要更多的Google Play服务,而不仅仅是这两个依赖项。我反编译了显式提到的两个项,命名的类不在其中。我开始查看本地Android SDK位置(在Visual Studio中配置),找到了'play-services-6.5.87.aar'。将其作为EmbeddedResourceJar包含在绑定程序集中,最终得到了SDK代码,以查找上面代码中列出的特定类。

我怀疑上面描述的Java包装器的价值,因为依赖项所需的一切现在都包含在EmbeddedReferenceJar中。似乎我应该直接绑定SDK AAR(不添加Java包装层)。我正在重新考虑这一点,并试图在JARS文件夹中创建指向SDK AAR的绑定程序集,然后使用NuGet包括Google Play服务。

接下来,(使用NuGet引用Google Play服务)我现在得到这样一个错误:没有找到与给定名称匹配的资源('value'处的值为'@integer/google_play_services_version')。{project name}{project path}\androidmanifest.xml我尝试了很多不同的方法来消除这个构建时错误,但没有任何运气。

如果我坚持使用Google'play-services-6.5.87.aar'中的JAR文件作为embeddedResourceJar,我不会得到构建错误,但我会得到运行时错误,即SDK无法找到所需的Android清单设置。如果你有一个这样安排的项目,我对使用哪一个Android Manifest是正确的吗?XXX PCL项目-->XXX.android项目<--我猜这就是将要使用的AndroidManifest.xml文件所在的位置....?---->xxx.android.aarbinding项目
---->JARS文件夹-->3pvendorsdk.aar

还在挖...

共有1个答案

胡景焕
2023-03-14

因为我的解决方案是跨平台的,所以我有:

  • Assembly:MyApplication(PCL Portable)
  • Assembly:myapplication.android
  • Assembly:myapplication.android.binding(包装第三方SDK,以AAR文件的形式提供)

当我们谈到这一点时,相应的。iOS项目/程序集将遵循这个命名模式。

  • JARS文件夹
    • 包含使用构建操作设置的my3rdparty.aar文件:'LibraryProjectZip'
    • metadata.xml-我必须对Visual Studio生成绑定代码的方式进行调整,以确保类型对齐等。
    • 我有一些方法返回的类型不能很好地映射到.NET,所以我使用attr元素来调整它们的“托管类型”和“托管返回”类型值。
      注意:您可以在一个方法上使用多个attr元素来根据需要对其进行调整。
    • 我不得不删除一个声明为virtual的方法(通过使用remove-node元素),并在自定义代码中作为重写重新添加它,以满足其基类的抽象类定义。
    • customCode.cs-重新添加一个需要从private更改为public的方法(它通过metadata.xml被删除)。(但是请注意,结果方法将是非功能性的,因为它只是一个空存根来满足抽象类继承)

    >

  • 清单

    • 缺乏准确/完整的SDK清单文档。
      在Android程序集中对SDK清单信息进行了更改。

    参考文献

      null
      null
      null
      null

    如上所述,当我构建MyApplication.Android.Binding时,它自己构建得很好。然而,当我在MyApplication.Android中引用它时,它生成了一个新的Java代码翻译构建错误,该错误涉及特定类的范围不符合预期/要求。为了解决这个问题,我返回到绑定程序集的metadata.xml文件,并选择从生成的Java代码接口中删除问题类,因为我没有调用或使用的计划。

    提示:在Visual Studio中,最简单的方法是在BindingAssembly项目中启用Show All Files功能,然后在obj\debug\generated\src\文件夹中查找问题类。找到它后,单击它,生成的Java接口代码将XPath语句生成为注释。这些是使用metadata.xml文件更改或删除问题类或方法所需的。

    现在我所需要做的就是在上面写我的跨平台代码(使用依赖项反转+Xamarin Forms内置的DependencyService在运行时到达每个SDK),我的应用程序应该可以运行了!

    希望这些发现对其他需要处理类似绑定场景的人有所帮助。

    如果你在这里看到任何不正确的内容,或者如果你有什么想补充的,请评论!

 类似资料:
  • 我尝试使用Java绑定库来使用MultiImageChooser(https://github.com/derosa/MultiImageChooser)。 以下是我采取的步骤: attr path=“/api/package[@name='com.luminous.pick']/class[@name='galleryadapter']/method[@name='get item']”name

  • 我们将这个库用于另一个项目,我们现在也在Xamarin中开发。目前,我们需要添加这两个库(用于ExoPlayer的my.aar和.jar)。老实说,这有点烦人,我很想把我的。Aar放进去,然后走。 所以两个问题: 有没有一种方法可以使用gradle和其他东西将ExoPlayer捆绑到我的。aar中?(我是个初学者,请仔细) 我意识到这可能不是最好的做法(依赖应该由应用程序管理,诸如此类),但实际上

  • 我正在将Java SDK移植到Xamarin.Android。 在解决了无数个错误后,我陷入了这一个: /users/alejandro_l/projects/KontaktBeaconSDK/KontaktBeaconSDK/obj/debug/generated/src/com.kontakt.sdk.android.ble.configuration.scan.eddystonescanco

  • 云联壹云平台支持对接第三方工单系统。 目前仅支持对接JIRA工单系统,且只有技术支持工单支持对接第三方工单系统。 第三方工单使用流程如下: 在系统配置-工单-第三方工单中对接第三方工单系统。 在工单配置中-配置技术支持工单,支持对接第三方工单系统。 用户提交的技术支持工单都需要第三方工单系统进行审批处理等。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “系统配置/工单/第三方”

  • 我有一个使用Java8特性的android库项目,即通过 任何帮助都是非常感谢的!谢了。

  • 选择元素和绑定数据是 D3 最基础的内容,本文将对其进行一个简单的介绍。 如何选择元素 在 D3 中,用于选择元素的函数有两个: d3.select():是选择所有指定元素的第一个 d3.selectAll():是选择指定元素的全部 这两个函数返回的结果称为选择集。 例如,选择集的常见用法如下。 var body = d3.select("body"); //选择文档中的body元素 var p1