gpt4 book ai didi

c# - Xamarin.Android与依赖项绑定(bind)到第三方SDK

转载 作者:行者123 更新时间:2023-12-01 23:30:44 26 4
gpt4 key购买 nike

我正在将VS2015 Update3与当前/最新的Xamarin一起使用,并试图创建一个绑定(bind)库来包装用Java编写的第三方SDK。我有C#/。Net背景,到目前为止还没有Java经验。此SDK取决于其他3个项目,这些项目可以作为AAR或通过NuGet获得。

我能够为父AAR创建一个绑定(bind)库,并通过一些MetaData.xml调整来调整参数类型和返回类型,并更正类访问器以满足其抽象基类,所有这些最初都阻止了生成的C#.Net Android从建筑物绑定(bind)库。现在,父绑定(bind)程序集已构建,但无法执行,因为它需要其他3个AAR依赖项。

所需的依赖项(在下面的文章中提到时,“#”是每个别名的别名):

  • “2”-> com.android.support:support-v4:25.1.1
  • “3”-> com.google.android.gms:play-services-location:10.2.0
  • “4”-> com.google.android.gms:play-services-gcm:10.2.0

  • 在这种情况下,如果我需要创建一个绑定(bind)dll来包装依赖于其他3个AAR的父AAR:

    我是否应该(A)创建4个绑定(bind)程序集-依赖于Bind_AAR_2.dll,Bind_AAR_3.dll和Bind_AAR_4.dll的父绑定(bind)程序集Bind_AAR_1.dll?

    或者,我是否应该(B)挖掘2、3和4个AAR文件,并从每个文件中获取JAR文件,然后使用“EmbeddedJar”(或其他属性/设置)将它们直接包含在Jars文件夹中的Bind_AAR_1.dll中?

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

    我已经尝试过每种方法(A),(B)和(C)的变化,但都没有运气,或者所产生的工作导致更多的工作,这使我想知道什么是最好的/正确的方法。

    在一个相关主题上,最好的方法是使用Metadata.xml文件从生成的包装器API中显式删除所有您不打算在Xamarin项目中直接使用的内容(类等)吗?似乎最好限制接口(interface)并减少绑定(bind)dll的生成大小(并可能减少生成时间)。

    任何帮助,将不胜感激!

    柯蒂斯

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

    4/11/2017-更新

    非常高兴收到@_JonDouglas之类的意见!但是...仍然无法使该SDK正常运行。

    我已经尝试了每种方法A,B和C,并且能够构建我的绑定(bind)项目(通过transforming/MetaData.xml进行操作)。第三方SDK设计/记录为Java解决方案的一部分。根据供应商的说明文档,此解决方案会将3个依赖项添加到其.gradle文件中,从而在整个Java解决方案中提供对这些项目的引用。我没有Java历史记录,因此请在此处关注。

    照原样,当我将带有Visual Studio的SDK(使用3种方法中的任何一种,单独或具有依赖项)包装到Xamarin Android绑定(bind)程序集中时,SDK在运行时会遇到ClassNotFound异常(由“未找到Google Play证明”)。日志)。从必需的Java依赖项中使用的类是通过后期绑定(bind)方式创建的,其中使用名称字符串作为类名,如下所示:
    try
    {
    Class.forName("com.google.android.gms.common.GooglePlayServicesUtil");

    //more code here
    }
    catch (ClassNotFoundException e)
    {
    Log.e("3rd Party SDK", "Google Play not found.");
    }
    似乎不重要的是,我如何使用上述3种方法在Visual Studio中构建绑定(bind)程序集以包括依赖项(1个AAR + 3个Nuget或1个AAR + 3个Jar在1个绑定(bind)中或4个AAR在4个绑定(bind)中使用项目引用)。在运行时,SDK似乎看不到它们。也许这是有道理的-SDK本身中没有指向它们的.gradle(如csproj文件)?

    我在想我需要做的(更接近供应商的说明)创建一个Java解决方案,其中包含一个.gradle文件,该文件包括SDK和Java项目中的3个依赖项,以创建一个AAR文件。然后,我相信我可以为所得的可压缩AAR创建Xamarin绑定(bind)程序集。然后,将对这个绑定(bind)程序集的引用添加到解决方案中的.Andriod程序集中,然后继续。

    理论(尚待证明):[失败。请参阅下面的4/12更新。]将Java SDK及其编码的依赖项(在.gradle中明确)包装在模块/库中,然后将其包装在Xamarin Android绑定(bind)库中。然后,我要做的就是从该包装器模块/库中找出需要使用(并公开)哪些公共(public)方法,添加这些公共(public)方法并将调用转发给SDK。

    大图:我正在尝试将其设计和编码为跨平台Xamarin解决方案,但正在使用特定于Android和IOS的SDK,这些SDK似乎都是应用程序/UI体验的一部分(旨在不仅仅是处理与第三方的交流)。 UI方面尚未发挥作用,因为到目前为止我还没有看到任何一种SDK函数。

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

    4/12/2017-更新

    理论(FAILED):将Java SDK及其编码的依赖项(在.gradle中明确)包装在模块/库中,然后将其包装在Xamarin Android绑定(bind)库中。我们对此进行了编码,构建,部署和测试。现在,我看到该应用程序在运行时进入了Java代码的第一层,但是找不到比该代码更低的任何引用代码(也称为依赖项)。包装器的代码运行良好,但是在运行时包装器找不到SDK的类,甚至找不到我们试图通过包装器使用的简单Java测试组件。当我们仅为它单独创建一个绑定(bind)文件,然后通过JAR或通过NuGet将其余文件引用到绑定(bind)程序集中时,这等效于我们首先遇到的SDK问题。仍然找不到较低级别的代码,仅执行Java的第一层。仍在尝试提出解决方案。

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

    4/13/2017-更新

    我已经取得了一些进展。正如他们所说,前进了一步,也许又退了两步。

    我现在意识到,第三方SDK不仅需要两个依赖项,还需要更多Google Play服务。我反编译了明确提到的两个项目,并且命名的类不在其中。我开始查看本地Android SDK位置(在Visual Studio中配置),并发现“play-services-6.5.87.AAR”。最后,以EmbeddedResourceJar的身份将其包含在我的绑定(bind)程序集中,最终获得了SDK代码,以查找上面的代码中列出的特定类。

    使用NuGet

    我质疑上述Java包装器的值(value),因为依赖项所需的所有内容现在都包含在EmbeddedReferenceJar中。似乎我应该直接绑定(bind)SDK AAR(不添加Java包装层)。我对此进行了重新思考,并尝试仅在JARS文件夹中创建指向SDK AAR的绑定(bind)程序集,然后使用NuGet包含Google Play服务。

    继续进行(使用NuGet引用Google Play服务),现在出现此错误:
    No resource found that matches the given name (at 'value' with value '@integer/google_play_services_version'). {project name} {project path}\AndroidManifest.xml
    我尝试了很多不同的方法来尝试消除此构建时错误,但是还没有碰到任何运气。

    不使用NuGet

    如果我坚持使用Google的“play-services-6.5.87.AAR”内部的JAR文件作为EmbeddedResourceJar,则不会出现构建错误,但会出现运行时错误,导致SDK无法找到Android list 所需的设置。如果您安排了这样的项目,那么我是否正确使用了哪个Android Manifest?
    XXX PCL Project
    --> XXX.Android project <-- My guess is that this is where the AndroidManifest.XML file is located that will be used....?
    ----> XXX.Android.AARBinding project

    ------> JARS folder --> 3pVendorSDK.AAR

    还在挖...

    最佳答案

    我如何最终使我的第三方Java SDK与Xamarin一起使用:

    由于我的解决方案是跨平台,因此我有:

  • 程序集:MyApplication(PCL便携式)
  • 程序集:MyApplication.Android
  • 程序集:MyApplication.Android.Binding
    (包装第3方SDK,作为AAR文件提供)

  • 当我们到达那个名称时,相应的.IOS项目/程序集将遵循此命名模式。

    Android绑定(bind)程序集
  • Jars文件夹
  • 包含My3rdParty.AAR文件集和Build Action:“LibraryProjectZip”
  • 转换文件夹
  • Metadata.XML-我必须对Visual Studio如何生成绑定(bind)代码进行调整,以确保类型对齐等。
  • 我有一些方法返回的类型不能很好地映射到.Net,因此我使用attr元素来调整其“managedType”和“managedReturn”类型值。注意:在一种方法上可以使用多个attr元素来获取它根据需要进行了调整。
  • 我必须删除一个声明为虚拟的方法(通过使用remove-node元素),然后将其重新添加到自定义代码中,作为覆盖它的基类的抽象类定义的替代。
  • 根文件夹
  • CustomCode.cs-重新添加一种需要从私有(private)更改为公共(public)的方法(已通过MetaData.xml删除了)。
    (请注意,虽然生成的方法将不起作用,因为它只是一个空的 stub ,可以满足抽象类的继承要求)

  • Android组装
  • list
  • 缺少准确/完整的SDK list 文档。
    Sdk list 信息的更改是在Android Assembly中进行的。
  • 引用
  • 添加对Android绑定(bind)程序集的引用。
  • 组件(NuGet)
  • 由于我的第3方的SDK已记录了对Google Play服务的依赖关系,并且我使用JD-GUI反编译了他们的代码以验证其试图使用的类/等,因此我在这个项目中添加了Xamarin.GooglePlayServices.Gcm,不是Binding Assembly项目。
    注意:在任何文档中,我都不清楚我会读入AAR依赖项的级别。在我的众多尝试中,我尝试了使用BuildAction of EmbeddedResourceJar将它们直接作为JAR(从AAR提取)添加到绑定(bind)程序集的JARS文件夹中的方法。找到所需的项目后,这提供了更好的运行时结果,但是感觉...好恶...似乎是解决维护问题的秘诀。必须有一个更好的方法。输入NuGet!
    注意:添加一项会带来以下所有项:
  • Xamarin.GooglePlayServices.Base
  • Xamarin.GooglePlayServices.Basement
  • Xamarin.GooglePlayServices.Gcm(通过VS Manage NuGet添加的那个)
  • Xamarin.GooglePlayServices.Iid
  • Xamarin.GooglePlayServices.Tasks
  • Assets
  • 我的第三方SDK使用了config.JSON文件,该文件需要放在此处,以便在运行时可以读取它。使用构建操作进行设置:“AndroidAsset”
  • 生成时间需要进行的其他工作:
  • 绑定(bind)程序集中的其他MetaData.XML更改。 -当Android程序集引用已编译的Binding程序集并尝试进行构建时,某些生成的代码此时会发生新的构建错误。

  • 装配绑定(bind)转换

    如上所述,当我构建MyApplication.Android.Binding时,它自己可以很好地构建。但是,当我在MyApplication.Android中引用它时,它生成了一个新的Java代码转换生成错误,该错误有关特定类的范围不符合预期/要求。为了解决这个问题,我返回到绑定(bind)程序集的MetaData.xml文件,并选择从生成的Java代码界面中删除问题类,因为我没有计划调用或使用它。

    提示:在Visual Studio中(我发现)最简单的方法是在BindingAssembly项目上启用“显示所有文件”功能,然后在obj\Debug\generated\src\文件夹中查找问题类。找到它后,单击它,然后生成的Java接口(interface)代码会将XPath语句生成为注释。这些是您使用MetaData.XML文件更改或删除问题类或方法所需要的。

    包起来

    现在,我需要做的就是在顶部编写跨平台代码(使用Dependency Inversion + Xamarin Forms内置的DependencyService在运行时访问每个SDK),并且我的应用程序应该不错!

    希望这些发现对需要通过类似约束情景工作的其他人有所帮助。

    如果您在此处看到任何不正确的内容,或者有任何要添加的内容,请发表评论!

    关于c# - Xamarin.Android与依赖项绑定(bind)到第三方SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43264285/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com