【问题标题】:Epson ePOS SDK for Android (Xamarin) missing constantsEpson ePOS SDK for Android (Xamarin) 缺少常量
【发布时间】:2019-02-09 11:30:29
【问题描述】:

我们正在尝试升级epson的SDK,该SDK已被弃用了很长时间。

我们使用的是旧的 ePOS-Print SDK (com.epson.eposprint) 包,但我们开始遇到问题,因此我们正确地决定迁移到当前的 Epson ePOS SDK for Android (com.epson.epos2 )。

我们正在使用 Visual Studio Xamarin。

我们遵循了 SDK 中包含的迁移文档。替换了大部分代码。但是,似乎 Xamarin 的 java 绑定有问题,或者缺少某些东西,因为几乎 90% 的枚举值都不可用。如果没有枚举值来正确调用方法几乎是不可能的...例如,我们确实有一些可用的枚举(如 BatteryLevelX、TMxx、Pattern*),但仅此而已。

我们使用的是 Android 8.0

我们的javabinding项目是这样配置的:

--JarLibrary
----Jars
-------ePOS2.jar
-------ePOSEasySelect.jar
----libs
------armeabi
--------libepos2.so
--------libeposeasyselect.so
------armeabi-v7a
--------libepos2.so
--------libeposeasyselect.so

项目属性:

Android 类解析器:jar2xml Android 代码生成目标:XAJavaInterop1

有什么想法吗?

编辑: 解决方案是确保 SDK 中没有可见性关键字的所有对象都使用 Metadata.xml 转换文件进行修复,这样:

<!-- On enlève l'ancienne classe du package qui ne sert plus à rien, juste pour la migration -->
<remove-node path="/api/package[starts-with(@name, 'com.epson.epsonio')]" />

<!-- Need to change the visibility of many ommited classes visibility in jar epos -->
<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='NativeDevice']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.commbox']/class[@name='NativeCommBox']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.commbox']/class[@name='NativeCommBoxManager']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.keyboard']/class[@name='NativeKeyboard']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.printer']/class[@name='NativePrinter']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.scanner']/class[@name='NativeScanner']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.simpleserial']/class[@name='NativeSimpleSerial']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='DeviceInnerImplement']"
      name="visibility">protected</attr>

<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='NativeDevice']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2.printer']/class[@name='CommonPrinter']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2.printer']/class[@name='LogoKeyCode']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2']/class[@name='NativeInitializer']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2']/class[@name='OutputLog']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.display']/class[@name='NativeDisplay']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='Device.DeleteDeviceCallbackAdapter']"
      name="visibility">protected</attr>

【问题讨论】:

  • 只是为了补充一点,我用java反编译器打开了com.epson.epos2,看起来常量在Printer类继承的抽象类CommonPrinter中。但是,在生成的c#包装类中,打印机类只继承自global::Java.Lang.Object 是不是绑定问题?
  • 如果有人可以将此download.epson-biz.com/modules/pos/… 添加到 jar xamarin 项目并使其构建,请告知。
  • @nicolas-belly 你让这个工作了吗?您对.so 文件的构建操作是什么?
  • @JonathanPeel 不,我们回滚到旧 SDK
  • @NicolasBelley:你能告诉我这个 SDK 工作正常的版本吗?并为我提供 SDK 以及我无法从 Epson 下载旧的 sdk

标签: java c# xamarin.android epos


【解决方案1】:

编辑: 解决方案是确保 SDK 中没有可见性关键字的所有对象都使用 Metadata.xml 转换文件进行修复,这样:

<!-- On enlève l'ancienne classe du package qui ne sert plus à rien, juste pour la migration -->
<remove-node path="/api/package[starts-with(@name, 'com.epson.epsonio')]" />

<!-- Need to change the visibility of many ommited classes visibility in jar epos -->
<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='NativeDevice']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.commbox']/class[@name='NativeCommBox']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.commbox']/class[@name='NativeCommBoxManager']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.keyboard']/class[@name='NativeKeyboard']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.printer']/class[@name='NativePrinter']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.scanner']/class[@name='NativeScanner']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.simpleserial']/class[@name='NativeSimpleSerial']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='DeviceInnerImplement']"
      name="visibility">protected</attr>

<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='NativeDevice']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2.printer']/class[@name='CommonPrinter']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2.printer']/class[@name='LogoKeyCode']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2']/class[@name='NativeInitializer']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.epos2']/class[@name='OutputLog']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice.display']/class[@name='NativeDisplay']"
      name="visibility">public</attr>

<attr path="/api/package[@name='com.epson.eposdevice']/class[@name='Device.DeleteDeviceCallbackAdapter']"
      name="visibility">protected</attr>

【讨论】:

    【解决方案2】:

    对于仍在为此苦苦挣扎的任何人,我找到了一个似乎可以在不重新编写库的情况下完成这项工作的解决方案。

    1. 在您的解决方案中,创建一个新的“Android 绑定库 (Xamarin)”项目。
    2. 将 ePOS2.jar(和 ePOSEasySelect.jar,如果需要)文件添加到“Jars”文件夹,并将文件的构建操作(在属性窗口中)设置为“EmbeddedJar”。
    3. Epson ePOS SDK for Android download 本地安装 OPOS 公共控制对象 (CCO) (OPOS_CCOs_1.14.001.msi)。
    4. 将所有生成的 .dll 文件从第 1 步复制到您的项目中。我在其中使用了一个“lib”文件夹,但您可以使用。
    5. 从项目中引用 .dll。
    6. 构建。

    您应该最终得到一个可以从其他项目中引用的库,并利用 Com.Epson.Epos2 命名空间和其中的所有类。

    作为参考,大部分有用的常量都是通过Com.Epson.Eposdevice namespace 访问的。例如Com.Epson.Eposdevice.Printer.Printer.LangEn

    注意:没有默认的 DiscoveryListener 类,所以如果你走这条路,你需要自己构建。

    还值得记住的是,大多数 Java 项目都使用 camelCaseFormatting 作为方法名称,因此当从文档中复制/粘贴示例时(这很糟糕),不要忘记将方法更改为 TitleCaseFormatting

    另外,还有:我不断收到global::Com.Epson.Epos2.Printer.LogoKeyCode 不存在的错误,无论出于何种原因。一个临时的解决方案是在 Bindings Library 的 Transforms 文件夹中的 MetaData.xml 文件中添加以下行:

      <remove-node path="/api/package[@name='com.epson.epos2.printer']/class[@name='Printer']/method[@name='getLogoList' and count(parameter)=0]"/>
    

    【讨论】:

    • 您可以查看我编辑过的答案,变化没有之前想象的那么大。我现在可以正确使用最新版本的 SDK 之一!
    猜你喜欢
    • 2017-03-06
    • 2015-08-09
    • 2017-01-27
    • 2014-05-11
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2020-11-15
    • 2020-07-26
    相关资源
    最近更新 更多