강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

토토톱님의 프로필 이미지
토토톱

작성한 질문수

유니티 시스템 프로그래밍 Pt.2 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지

유저 데이터 온라인 DB 로드 및 저장 Pt.4 (UserGoodsData, UserSettingsData, UserPlayData, UserAchievementData, UserInventoryData)

구글로그인 인증 에러 문제 살려주세요 ㅠㅠ

해결된 질문

작성

·

70

0

DllNotFoundException: Unable to load DLL 'native-googlesignin'. Tried the load the following dynamic libraries: Unable to load dynamic library 'native-googlesignin' because of 'Failed to open the requested dynamic library

 

처음에 강의를 따라하다가 에러가 떠서 Q&A내용들 확인하고 동일한 에러가 있는걸 발견하고 따라했습니다.

 

https://github.com/googlesamples/google-signin-unity/issues/106

 

이 깃허브 내용도 확인했습니다.

 

깃허브 및 Q&A 내용대로

1.srcarr -> arr로 변경하고

2. .arr파일에서 android 체크

  1. edm4u resolve (깃허브에는 ./Plugins/Andoid/ 산하에 .jar파일들이 생성된다고했는데 전 안됬습니다.)

진행했습니다.

 

그러니까 이번에는 로그캣에 61페이지 분량 크래시 로그가뜨면서 종료되는데 혹시 어떻게 해봐야할까요?

 

 

2025-10-08 23:26:35.716 21847 21879 Fatal tSoft.MyProject java_vm_ext.cc:616] JNI DETECTED ERROR IN APPLICATION: mid == null

2025-10-08 23:26:35.716 21847 21879 Fatal tSoft.MyProject java_vm_ext.cc:616]     in call to CallStaticVoidMethodV

2025-10-08 23:26:35.716 21847 21879 Fatal tSoft.MyProject java_vm_ext.cc:616]     from boolean com.unity3d.player.UnityPlayer.nativeRender()

2025-10-08 23:26:35.776 21847 21879 Warn tSoft.MyProject sched_getscheduler(22014): No such process

2025-10-08 23:26:35.776 21847 21879 Warn tSoft.MyProject sched_getparam(22014, &sp): No such process

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] Runtime aborting...

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] Dumping all threads without mutator lock held

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] All threads:

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] DALVIK THREADS (41):

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] "main" prio=10 tid=1 Native

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | group="" sCount=1 ucsCount=0 flags=1 obj=0x72cfd3a8 self=0xb4000079b91d37b0

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | sysTid=21847 nice=-10 cgrp=top-app sched=0/0 handle=0x7c82484d28

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | state=S schedstat=( 334617993 29619772 266 ) utm=22 stm=11 core=6 HZ=100

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | stack=0x7fcbb05000-0x7fcbb07000 stackSize=8188KB

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | held mutexes=

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   native: #00 pc 000bd788  /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+8) (BuildId: 3549de9a967b5089252c4ca16436800c)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   native: #01 pc 00010fa0  /system/lib64/libutils.so (android::Looper::pollOnce+216) (BuildId: 880c071958aa3788bc08025b2e2bae17)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   native: #02 pc 0018e6b4  /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce+44) (BuildId: 2e949cb5813b36a6c68d06191a1b108e)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at android.os.MessageQueue.nativePollOnce(Native method)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at android.os.MessageQueue.next(MessageQueue.java:346)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at android.os.Looper.loopOnce(Looper.java:214)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at android.os.Looper.loop(Looper.java:342)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at android.app.ActivityThread.main(ActivityThread.java:9634)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at java.lang.reflect.Method.invoke(Native method)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:619)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] 

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709] "FinalizerDaemon" prio=5 tid=6 Waiting

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | group="" sCount=1 ucsCount=0 flags=1 obj=0x2b40378 self=0xb4000079b91d5380

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | sysTid=21854 nice=4 cgrp=top-app sched=0/0 handle=0x793cf585f0

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | state=S schedstat=( 3540231 0 2 ) utm=0 stm=0 core=3 HZ=100

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | stack=0x793cb55000-0x793cb57000 stackSize=4109KB

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   | held mutexes=

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   native: #00 pc 0008029c  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28) (BuildId: 3549de9a967b5089252c4ca16436800c)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   native: #01 pc 00201230  /apex/com.android.art/lib64/libart.so (art::ConditionVariable::WaitHoldingLocks+136) (BuildId: eb4ec0f1d1c7267591d83fa87cb36390)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   native: #02 pc 004af4ec  /apex/com.android.art/lib64/libart.so (art::Monitor::Wait+1088) (BuildId: eb4ec0f1d1c7267591d83fa87cb36390)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   at java.lang.Object.wait(Native method)

2025-10-08 23:26:35.901 21847 21879 Fatal tSoft.MyProject runtime.cc:709]   - waiting on <0x0654f29f> (a java.lang.Object)

답변 2

0

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

크래시는 Firebase SDK 버전 문제로 추측됩니다. 현재 사용하시는 유니티 버전과 Firebase SDK 버전이 어떻게 되시는지 공유 부탁 드립니다.

토토톱님의 프로필 이미지
토토톱
질문자

유니티는 현재 2022.3.62f2버전을 사용하고 있습니다.

Analytics/Auth/Firestore/RemoteConfig 모두 13.3.0 버전입니다.

Google-Sign-in은 1.0.4 버전입니다.

 

 

혹시 정확히 어느 시점에서 크래시가 발생했는지 알 수 있을까요? Firebase를 초기화할 때 크래시가 났다든가, FirebaseManager 스크립트에서 정확히 어떤 함수를 호출할 때 크래시가 난다든가 등의 정보가 있으면 디버깅하기 수월할 것 같습니다. 일단 제가 찾은 해결 방법 두가지가 있기는 한데 확실한 해결방법이 될 진 모르겠습니다.

  1. AndroidManifest.xml에서 android:exported="true" 확인

    • Android 12 이상에서는 이 속성이 누락되면 앱이 실행되지 않거나 Firebase 초기화에 실패할 수 있음.

  2. Firebase 초기화 시점 변경

    • Start() 또는 Awake()에서 바로 초기화하지 말고, 1~2초 있다가 초기화.

토토톱님의 프로필 이미지
토토톱
질문자

초기화되고 RemoteConfig로 버전확인하고 인증을 요청하는 부분에서 바로 크래시가 납니다.
public void SignInWithGoogle(Action OnAfterSignAction)

{

try

{

Debug.Log($"Google Signing : CreateConfig");

GoogleSignIn.Configuration = m_GoogleSignInConfiguration;

Debug.Log($"Google Signing : {m_GoogleSignInConfiguration.AccountName}, {m_GoogleSignInConfiguration.WebClientId}");

// 1. Config파일 기반으로 로그인 요청

// - 로그인 결과로 계정 정보를 task형태 콜백으로 반환받음.

Debug.Log($"Google Signing : Send Request");

GoogleSignIn.DefaultInstance.SignIn().ContinueWithOnMainThread(task =>

{

Debug.Log($" Google Signing : Get Response ");

// 2. 로그인 실패 확인

if (task.IsCanceled || task.IsFaulted)

{

if (task.IsCanceled)

{

Logger.LogError($"SignInWithGoogle was canceled.");

}

else if (task.IsFaulted)

{

Logger.LogError($"SignInWithGoogle encountered an error: {task.Exception}");

}

return;

}

Debug.Log($" Google Signing : Login Success ");

// 3. 로그인 성공시 Firebase Auth 진행

// 3-1. 자격증명 토큰 GET

Debug.Log($" Google Signing : Create Tokken1");

GoogleSignInUser googleUser = task.Result;

Debug.Log($" Google Signing : Create Tokken2");

Credential credential = GoogleAuthProvider.GetCredential(googleUser.IdToken, null);

Debug.Log($" Google Signing : Create Tokken3");

// 3-2. 자격증명 토큰으로 Firebase Auth 진행

Debug.Log($"Google Signing :Start Firebase Auth");

m_Auth.SignInWithCredentialAsync(credential).ContinueWithOnMainThread(authTask =>

{

Debug.Log($"Google Signing : Auth Return");

// 3-3. Auth 인증 실패 확인

if (authTask.IsCanceled || authTask.IsFaulted)

{

if (authTask.IsCanceled)

{

Logger.LogError($"SignInWithCredentialAsync was canceled.");

}

else if (authTask.IsFaulted)

{

Logger.LogError($"SignInWithCredentialAsync encountered an error: {authTask.Exception}");

}

return;

}

Debug.Log($"Google Signing : Auth Success");

// 3-3. Auth인증 성공시 결과 저장

m_FirebaseUser = authTask.Result;

Logger.Log($"User signed in successfully: {m_FirebaseUser.DisplayName} ({m_FirebaseUser.UserId})");

Debug.Log($"Google Signing : Auth Success2");

// 3-4. 캐시값 및 데이터 저장.

HasSignedInWithGoogle = true;

HasSignedInWithApple = false;

//SaveData();

// 3-5. 모든 결과를 마쳤으므로 완료 콜백 호출

OnAfterSignAction?.Invoke();

});

});

}

catch (Exception e)

{

Logger.LogError($" Try-Catch : Exception in SignInWithGoogle: {e}");

}

}

Debug.Log($"Google Signing : Send Request");이 부분까지만 찍히고 그 후에 바로 크래시가 납니다.

에디터에서 테스트가안되는게 너무 힘드네요..ㅠㅠ

네 공유 감사합니다. 그럼 정확히 에러가 나는 부분은 GoogleSignIn.DefaultInstance.SignIn().ContinueWithOnMainThread 라고 볼 수 있겠네요.

뭔가 GoogleSignIn이 제대로 초기화가 안되서 그런게 아닌가 싶습니다. 아래 2가지 확인 좀 부탁 드립니다.

  1. GoogleSignIn.Configuration 제대로 설정되었는지 확인

        m_GoogleSignInConfiguration = new GoogleSignInConfiguration
        {
            WebClientId = GOOGLE_WEB_CLIENT_ID,
            RequestIdToken = true
        };
  1. 제대로 설정되었다면 SignIn 전에 SignOut 먼저 호출 해보기(Signout 일단 호출하고 그 다음에 SignIn 호출)

원래 이런 SDK 연동 및 구현이 실제 개발에서 제일 끈기를 요하는 부분입니다. 매번 빌드해서 확인해야 하기 때문입니다. 하지만 이겨내셔야 합니다.😢

 

토토톱님의 프로필 이미지
토토톱
질문자

 

private void InitAuth()

{

m_Auth = FirebaseAuth.DefaultInstance;

if (m_Auth == null)

{

Logger.Log($"FirebaseApp initialization failed. FirebaseAuth is null");

return;

}

 

m_Auth.StateChanged += OnAuthStateChanged;

Debug.Log("Google Sing: Init Config");

m_GoogleSignInConfiguration = new GoogleSignInConfiguration

{

WebClientId = GOOGLE_WEB_CLIENT_ID,

RequestIdToken = true

};

Debug.Log($"Google Sing: Init Conifg Comptete/ WebClientID ::: {m_GoogleSignInConfiguration.WebClientId} / RequestIdToken ::: {m_GoogleSignInConfiguration.RequestIdToken}");

 

m_IsAuthInit = true;

}

public void SignOut()

{

Debug.Log($"Google Sing: FireBaseUser :::: {m_FirebaseUser == null} ");

if (m_FirebaseUser != null)

{

Debug.Log($"Google Sing: AuthSignOut Start ");

m_Auth.SignOut();

Logger.Log($"User signed out successfully.");

Debug.Log($"Google Sing: AuthSignOut End ");

}

}

 

public void SignInWithGoogle(Action OnAfterSignAction)

{

try

{

Debug.Log($"Google Signing : CreateConfig");

GoogleSignIn.Configuration = m_GoogleSignInConfiguration;

Debug.Log($"Google Sing: Init Conifg Comptete/ WebClientID ::: {GoogleSignIn.Configuration.WebClientId} / RequestIdToken ::: {GoogleSignIn.Configuration.RequestIdToken}");

Debug.Log($"Google Sing: Start Sign Out ");

SignOut();

Debug.Log($"Google Sing: End Sign Out ");

// 1. Config파일 기반으로 로그인 요청

// - 로그인 결과로 계정 정보를 task형태 콜백으로 반환받음.

Debug.Log($"Google Signing : Send Request");

GoogleSignIn.DefaultInstance.SignIn().ContinueWithOnMainThread(task =>

{

Debug.Log($" Google Signing : Get Response ");

// 2. 로그인 실패 확인

if (task.IsCanceled || task.IsFaulted)

{

if (task.IsCanceled)

{

Logger.LogError($"SignInWithGoogle was canceled.");

}

else if (task.IsFaulted)

{

Logger.LogError($"SignInWithGoogle encountered an error: {task.Exception}");

}

return;

}

Debug.Log($" Google Signing : Login Success ");

// 3. 로그인 성공시 Firebase Auth 진행

// 3-1. 자격증명 토큰 GET

Debug.Log($" Google Signing : Create Tokken1");

GoogleSignInUser googleUser = task.Result;

Debug.Log($" Google Signing : Create Tokken2");

Credential credential = GoogleAuthProvider.GetCredential(googleUser.IdToken, null);

Debug.Log($" Google Signing : Create Tokken3");

// 3-2. 자격증명 토큰으로 Firebase Auth 진행

Debug.Log($"Google Signing :Start Firebase Auth");

m_Auth.SignInWithCredentialAsync(credential).ContinueWithOnMainThread(authTask =>

{

Debug.Log($"Google Signing : Auth Return");

// 3-3. Auth 인증 실패 확인

if (authTask.IsCanceled || authTask.IsFaulted)

{

if (authTask.IsCanceled)

{

Logger.LogError($"SignInWithCredentialAsync was canceled.");

}

else if (authTask.IsFaulted)

{

Logger.LogError($"SignInWithCredentialAsync encountered an error: {authTask.Exception}");

}

return;

}

Debug.Log($"Google Signing : Auth Success");

// 3-3. Auth인증 성공시 결과 저장

m_FirebaseUser = authTask.Result;

Logger.Log($"User signed in successfully: {m_FirebaseUser.DisplayName} ({m_FirebaseUser.UserId})");

Debug.Log($"Google Signing : Auth Success2");

// 3-4. 캐시값 및 데이터 저장.

HasSignedInWithGoogle = true;

HasSignedInWithApple = false;

//SaveData();

// 3-5. 모든 결과를 마쳤으므로 완료 콜백 호출

OnAfterSignAction?.Invoke();

});

});

}

catch (Exception e)

{

Logger.LogError($" Try-Catch : Exception in SignInWithGoogle: {e}");

}

}


테스트한 코드 상태는 이렇고 GoogleSignIn.Configuration확인(1), SingOut(2) 먼저호출 이 순으로 해보고 해도 똑같은 부분에서 문제가 발생하네요.

어째 하면할수록 더 멘붕이네요

이게 로그를 좀 살펴보니 Firebase SDK나 google-sign-in 패키지 문제인지 아니면 다른 문제인지 잘 모르겠습니다….

현재 프로젝트는 용량 문제로 Addressable과 PAD로 .ABB파일을 빌드하고 있습니다.

그래서 강의에서 설치한 SDK외에도 이 두 패키지가 더 설치되어있습니다.

우선 제 생각에는 문제가 google-sign-in 문제거나 아니면 Addressable+PAD 조합의 문제로 sdk나 내부 경로를 못찾아 문제가 발생하는것같습니다

혹시 이런 경우에는 어떤 부분들을 확인해봐야할까요?

image.png

 

 

image.png

 혹시 디스코드나 메일같은게 있으시면 로그캣을 한번 전체 보내봐드려도 괜찮을까요?



일단 이거 하나만 더 해보시겠어요?

AndroidManifest.xml 파일에서 tools:node="replace" 이 부분이 있으면 삭제하고 빌드해서 테스트 부탁 드립니다. 그래도 해결이 안되면 burningcarrotstudio@gmail.com으로 FirebaseManager.cs 파일 전체랑 로그캣 로그 전부 메일로 보내주세요.

토토톱님의 프로필 이미지
토토톱
질문자

네...그래도 해결이 안되서 메일 드렸습니다

토토톱님의 프로필 이미지
토토톱
질문자

일단 이 문제에 대해서 해결이 되었고, 동일한 문제를 겪으실 분들이 있을것같아 내용 공유드립니다. 

 

제 케이스의 경우에는 유니티 빌드 옵션중에 Minify에서 Release를 체크했을 때 앱에서 GoogleSignIn패키지의 SignIn()함수를 호출하면 크래시가 났었습니다. 

 

여러가지 테스트 후에 Release체크를 풀고 빌드하면 정상 작동 되는 것을 확인했고 

 

Minify빌드옵션중에 Release로 빌드를 할 때 코드를 난독화하는 과정에서 매핑이 안됐었던것같습니다. 

 

제 경우의 해결 방법으로는 

 

  1. 여기 강의 질문글에 올라온 다른 비슷한 증상들의 해결법들 모두 적용. 

  2. 패키지 및 외부 SDK들을 정상 설치한 상태에서 EDM4U의 Force Resolve로 종속성 정리

  3. 프로젝트 세팅에서 Custom Proguard 사용 설정하고 아래 코드 추가
    -keep class com.google.googlesignin.** { *; }

  4. Aab 파일 빌드 후에 MappingContext.txt, 디버깅 심볼 수동으로 플레이 콘솔에 업로드. 

 

이 과정으로 해결됬습니다. 도움을 주신 BurningCarrot님 감사합니다!

 

와우! 해결하시느라 정말 고생 많으셨습니다! 해결 방안 공유해 주셔서 감사합니다. 다른 수강생분들께 큰 도움이 될 것 같습니다!😆

0

안녕하세요, 인프런 AI 인턴입니다. 토토톱님.

Google 로그인과 관련하여 발생한 DllNotFoundException과 그로 인한 크래시 문제에 대해 설명드리겠습니다. 이러한 문제는 종종 라이브러리의 경로나 빌드 설정과 관련이 있습니다. 아래는 이를 해결하기 위해 시도해볼 수 있는 단계입니다:

해결 방법:

  1. EDM4U(External Dependency Manager for Unity) 설정 확인:

    • edm4u를 사용하여 모든 의존성이 올바르게 해결되었는지 확인해보세요. External Dependency Manager로 Resolve를 다시 시도하여 관련 라이브러리가 설치되었는지 점검하세요.
  2. 플랫폼별 설정 확인:

    • Unity Editor의 File > Build Settings에서 현재 플랫폼이 Android로 설정되어 있는지 확인해주세요. 그리고 Player Settings > Publishing Settings > ARCore"를 “Required”로 설정해 보세요.
  3. Android NDK 및 SDK 확인:

    • Android용 NDK 및 SDK가 제대로 설치되어 있는지 확인하세요. NDK가 없는 경우 Unity Hub를 통해 설치해주시기 바랍니다.
    • Unity 버전에 맞는 NDK 버전을 사용해야 할 수 있습니다. Unity의 설명서를 참조하여 해당 정보에 대해 확인하세요.
  4. JNI Error (java_vm_ext.cc 관련):

    • 이 문제는 Android 스튜디오에서 발생할 수도 있으며, 호출하려는 메서드가 존재하지 않을 때 발생합니다. 코드 상에서 JNI 호출을 올바르게 설정했는지 확인해주세요.
    • Google Sign-In API 문서를 참고해 설정이 모두 올바르게 구성되어 있는지 확인하세요. 특히 AndroidJavaObject를 사용할 때 적절한 방향으로 객체가 초기화되고 있는지 점검합니다.
  5. 기존 유사 질문 및 해결 사례 참고:

    • 비슷한 문제를 해결한 사례를 참고하시면 좋습니다. 예를 들어, GitHub 이슈인프런 강의 Q&A 섹션에서 다른 사용자의 경험을 확인하실 수 있습니다.

위의 사항을 하나씩 점검하면서 문제를 해결해 보시길 권장드립니다. 만약 이 방법들로도 문제가 해결되지 않는다면, 빌드 환경이나 Google Sign-In의 다른 설정을 재검토하셔야 할 수도 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

토토톱님의 프로필 이미지
토토톱

작성한 질문수

질문하기