在 Unity3D Android 插件中使用时找不到 Firebase ML Kit 类

Firebase ML Kit class not found when used in Unity3D Android Plugin

提问人:user2566720 提问时间:12/14/2019 更新时间:12/17/2019 访问量:707

问:

Firebase MLKit,特别是用于人脸检测的视觉组件,目前没有官方的 unity3D 插件。我正在尝试创建一个 android 模块,然后通过使用 Unity 的 AndroidJavaClass 接口将它作为插件导入到 Unity3D 中。(build module -> copy classes.jar 到 unity 的 Plugin/Android 文件夹)。我的问题是插件工作正常,但是每当它尝试调用与Firebase关联的任何行时,我都会收到以下错误。有人知道问题出在哪里吗?我认为这只是一个简单的依赖问题,但我在修复它时遇到了麻烦。

正在调用的行。它是直接从官方文档中复制的,如果我将该模块保留为 android studio 中的原生 android 应用程序,它就可以工作。

import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetectorOptions;

FirebaseVisionFaceDetectorOptions options =
        new FirebaseVisionFaceDetectorOptions.Builder()
                .setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE)
                .setLandmarkMode(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
                .setClassificationMode(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
                .build();

产生的错误(仅作为 unity3d 插件)

12-14 16:15:17.934 29990 30008 E Unity   : AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/firebase/ml/vision/face/FirebaseVisionFaceDetectorOptions$Builder;
12-14 16:15:17.934 29990 30008 E Unity   : java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/firebase/ml/vision/face/FirebaseVisionFaceDetectorOptions$Builder;
12-14 16:15:17.934 29990 30008 E Unity   :      at com.danq.faceplugin.FaceD.Init(FaceD.java:14)
12-14 16:15:17.934 29990 30008 E Unity   :      at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
12-14 16:15:17.934 29990 30008 E Unity   :      at com.unity3d.player.UnityPlayer.c(Unknown Source:0)
12-14 16:15:17.934 29990 30008 E Unity   :      at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95)
12-14 16:15:17.934 29990 30008 E Unity   :      at android.os.Handler.dispatchMessage(Handler.java:102)
12-14 16:15:17.934 29990 30008 E Unity   :      at android.os.Looper.loop(Looper.java:227)
12-14 16:15:17.934 29990 30008 E Unity   :      at com.unity3d.player.UnityPlayer$e.run(Unknown Source:20)
12-14 16:15:17.934 29990 30008 E Unity   : Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.ml.vision.face.FirebaseVisionFaceDetectorOptions$Builder" on path: DexPathList[[zip file "/data/app/com.Danq.FaceBeatsUnityGame-4MLAWSIBswXt4mPwAhlr_Q==/base.apk"],nativeLibraryDirectories=[/data/app/com.Danq.FaceBeatsUnityGame-4MLAWSIBswXt4mPwAhlr_Q

模块的 gradle 文件

apply plugin: 'com.android.library'


android
        {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"


    defaultConfig
            {
        minSdkVersion 27
        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'
        }
    }

            repositories {
                google()
                jcenter()

            }

}

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

    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.firebase:firebase-ml-vision:18.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    implementation 'com.google.gms:google-services:4.2.0'
}
Android Firebase Unity-游戏引擎 android-gradle-plugin android-studio-3.0

评论


答:

1赞 Patrick Martin 12/17/2019 #1

这里发生的情况是,您的库具有一些依赖项,这些依赖项将在纯 Android Studio 应用程序中捕获。遗憾的是,这些依赖项不会通过存档捕获或传达,需要在 Unity 的构建系统中复制。aar

我认为解决这个问题的最佳方法是让 Unity 为您生成一个 mainTemplate.gradle 文件。如果您让 Play Services 解析程序为您的 mainTemplate.gradle 打补丁(我在这里用图片逐步介绍),您的所有依赖项都将集中在一个地方。

然后,您应该能够转到文件的部分并添加dependenciesmainTemplate.gradle

    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.firebase:firebase-ml-vision:18.0.1'

就像你在图书馆里所做的那样。请确保不要将依赖项放在 和 之间,也不要删除 。// Android Resolver Dependencies Start// Android Resolver Dependencies End**DEPS**

现在,还有其他几个选择。您可以将库构建到本地 maven 存储库中,并以这种方式包含依赖项。由于我自己没有这样做,因此我无法提供详细的说明。但是,您可以像 Firebase 插件本身一样包含您的库及其传递依赖项(为两次使用同一链接而道歉)。

您也可以尝试更改为您的库,但我不相信这实际上会将依赖项嵌入到您生成的存档中。如果您这样做并且它解决了没有上述 gradle 文件更改的问题,请务必告诉我!您可以找到有关 vs. 的更多信息。 这里implementationapiaarapiimplementation

我希望这会有所帮助!

--帕特里克