如何在具有JAR导出的Gradle脚本中包含“实现”依赖项?

时间:2019-12-18 19:33:53

标签: android unity3d gradle plugins

我正在编写一个使用this library here的Android Unity插件,但是在获取此依赖项并导出整个插件的JAR文件时遇到了问题。

我一直关注this video here,了解如何使插件能够在Android和Unity之间进行双向通信。

以前在this post中,在将Unity Classes JAR文件放入Android Studio时遇到了问题,因此我可以构建插件。上面的视频显示,不是将最终的AAR输出导入到Unity中,而是从中间目录获取JAR文件,然后将其导入。当所有代码都是独立的,但是此特定的JAR文件没有我需要包含的usb-serial-for-android库时,此方法有效。

视频显示在Gradle脚本中包含一个include语句,其中包含classes.jar,其中包含JAR导出上的Unity代码。我之所以不包括它,是因为它没有它就可以工作,并且会造成我在previous post中遇到的重复类问题。

现在,我正在尝试在Gradle脚本中找出如何包括我拥有的com.github.mik3y:usb-serial-for-android:v2.1.0依赖关系,但是我不确定如何。视频中的上一个include语句包括一个本地JAR文件。我不知道如何像我需要的那样使用github存储库来做到这一点。

我已经尝试了最终的AAR输出,因为它应该包含usb-serial-for-android,但是我再次遇到Unity代码的重复类问题。

apply plugin: 'com.android.library'

android {
   compileSdkVersion 29
   buildToolsVersion "29.0.2"


   defaultConfig {
      minSdkVersion 17
      targetSdkVersion 29
      versionCode 1
      versionName "1.0"

      testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
      consumerProguardFiles 'consumer-rules.pro'
   }

   buildTypes {
      release {
         minifyEnabled false
         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      }
   }

   afterEvaluate {
      assembleRelease.finalizedBy(exportJar)
   }

}

allprojects {
   repositories {
      maven { url 'https://jitpack.io' }
   }
}

dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])

   implementation 'androidx.appcompat:appcompat:1.1.0'
   implementation 'com.github.mik3y:usb-serial-for-android:v2.1.0'
   testImplementation 'junit:junit:4.12'
   androidTestImplementation 'androidx.test.ext:junit:1.1.1'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

task exportJar (type: Copy) {
   from('build/intermediates/packaged-classes/release/classes.jar')
   include('com.github.mik3y:usb-serial-for-android') ???
   into('../../../UnityProjects/Coffee/Assets/Plugins/Android')
   rename('classes.jar', 'expressoplugin-release.jar')
}

task deleteOldJar (type: Delete) {
   delete '../../../UnityProjects/Coffee/Assets/Plugins/Android/expressoplugin-release.jar'
}

exportJar.dependsOn(deleteOldJar)

我注意到,当include语句使用“ com.github.mik3y:usb-serial-for-android”而不是“ classes.jar”时,exportJar任务似乎并没有默默地失败。 / p>

奇怪的是,这个include语句甚至没有将classes.jar中的所有内容放入导出的JAR中,因此我不确定我希望它做什么。

当我尝试实例化包含usb-serial-for-android代码的Java对象而执行导出而没有任何include语句时的错误日志。

2019-12-18 15:35:38.669 25826-25860/com.vcom3d.coffeeunity E/Unity: AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/hoho/android/usbserial/util/SerialInputOutputManager$Listener;
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/hoho/android/usbserial/util/SerialInputOutputManager$Listener;
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:454)
        at java.lang.Class.forName(Class.java:379)
        at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
        at com.unity3d.player.UnityPlayer.c(Unknown Source:0)
        at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72)
        at android.os.MessageQueue.next(MessageQueue.java:405)
        at android.os.Looper.loop(Looper.java:174)
        at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32)
     Caused by: java.lang.ClassNotFoundException: com.hoho.android.usbserial.util.SerialInputOutputManager$Listener
        at java.lang.Class.classForName(Native Method) 
        at java.lang.Class.forName(Class.java:454) 
        at java.lang.Class.forName(Class.java:379) 
        at com.unity3d.player.UnityPlayer.nativeRender(Native Method) 
        at com.unity3d.player.UnityPlayer.c(Unknown Source:0) 
        at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72) 
        at android.os.MessageQueue.next(MessageQueue.java:405) 
        at android.os.Looper.loop(Looper.java:174) 
        at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32) 
      at UnityEngine.AndroidJNISafe.CheckException () [0x00091] in <6084548bc46840b9ba4aa48ad550def0>:0 
      at UnityEngine.AndroidJNISafe.NewObject (System.I
    ```

1 个答案:

答案 0 :(得分:0)

我想出了一种解决方法,可以访问该库的JAR文件。在左侧的项目导航器中,我从下拉菜单中转到项目视图,向下滚动到库所在的位置,打开磁盘上的文件位置,然后将JAR手动复制到Unity。

enter image description here