Firebase MLKit,特别是人脸检测的视觉组件,目前还没有官方的unity3D插件。我正在尝试创建一个android模块,然后通过Unity的AndroidJavaClass界面作为插件导入到Unity3D中。(构建模块->将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'
}发布于 2019-12-17 01:16:48
这里发生的情况是,您的库具有一些依赖项,这些依赖项将在纯Android Studio应用程序中捕获。不幸的是,这些依赖关系不会通过你的aar档案被捕获或传达,并且需要在Unity的构建系统中复制。
我认为解决这个问题的最好方法是为你准备Unity generate a mainTemplate.gradle文件。如果您让Play Services解析器修补您的mainTemplate.gradle (带有图像的I cover this step by step here),您的所有依赖项将集中在一个位置。
然后,您应该能够转到mainTemplate.gradle文件的dependencies部分并添加
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存储库中,并以这种方式包含依赖项。由于我自己没有这样做,所以我不能提供详细的说明。但是,你可以包含你的库和它的传递依赖just like the Firebase plugin itself (很抱歉使用了两次相同的链接)。
您也可以尝试将库的implementation更改为api,但我不认为这实际上会将依赖项嵌入到生成的aar归档中。如果你这样做了,并且在不修改上面的gradle文件的情况下解决了这个问题,一定要让我知道!您可以在api与implementation here上找到更多信息。
我希望这能帮到你!
--帕特里克
https://stackoverflow.com/questions/59333696
复制相似问题