0

我们正在尝试升级已弃用很久的 epson 的 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*),但仅此而已。

我们使用的是安卓 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>
4

2 回答 2

2

编辑:解决方案是确保 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>
于 2019-03-21T16:46:07.010 回答
0

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

  1. 在您的解决方案中,创建一个新的“Android 绑定库 (Xamarin)”项目。
  2. 将 ePOS2.jar(和 ePOSEasySelect.jar,如果需要)文件添加到“Jars”文件夹,并将文件的构建操作(在属性窗口中)设置为“EmbeddedJar”。
  3. 从Epson ePOS SDK for Android 下载本地安装 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无论出于何种原因都不存在。一个临时解决方案是将以下行添加到MetaData.xml绑定库Transforms文件夹中的文件中:

  <remove-node path="/api/package[@name='com.epson.epos2.printer']/class[@name='Printer']/method[@name='getLogoList' and count(parameter)=0]"/>
于 2020-04-01T11:07:56.037 回答