유니티에서 안드로이드 플러그인을 만들고 사용하는 방법에 관한 포스팅이다.
지난 포스팅에 이어 이번 포스팅에서는 네이티브 플러그인 사용 방법에 대해 다룬다.테스트 환경은 다음과 같으며 지난 번에 사용한 프로젝트를 동일하게 활용할 예정이다.
Unity 2021.3.1f1 / Android Studio Bumblebee (2021.1.1) / Android 11
so 파일을 얻기 위해 Android Studio 에서 Native C++ 로 새로운 프로젝트를 생성해준다.
CMakeLists.txt
파일은 이렇게 세팅해준다.
cmake_minimum_required(VERSION 3.18.1)
project("androidnativepluginexample")
add_library(
AndroidNativePlugin
SHARED
native-lib.cpp
)
find_library(
log-lib
log
)
target_link_libraries(
AndroidNativePlugin
${log-lib}
)
native-lib.cpp
의 코드는 간단하게 작성했다.
#include <jni.h>
#include <string>
#include <stdio.h>
#include <dlfcn.h>
extern "C" {
void* handle;
FILE* (*my_fopen)(const char*, const char*);
void __attribute__ ((constructor)) init(){
handle = dlopen("libc.so", RTLD_LAZY);
*(void **)(&my_fopen) = dlsym(handle,"fopen");
}
void rootCheck() {
if(my_fopen("/system/bin/su", "r") != NULL) {
abort();
}
}
}
Build
> Build Bundle(s) / APK(s)
> Build APK(s)
> app-debug.apk
> lib
폴더를 Unity 의 Assets
> Plugins
> Android
폴더에 옮겨준다.
Unity 에서 Assets
> Scripts
> AndroidNativePlugin.cs
파일을 생성하고 다음과 같이 코드를 작성한다.
using UnityEngine;
using System;
using System.Runtime.InteropServices;
public class AndroidNativePlugin : MonoBehaviour
{
[DllImport ("AndroidNativePlugin")]
private static extern void rootCheck();
public static void RootCheck() {
rootCheck();
}
}
코드를 잠깐 살펴보면 [DllImport("")]
를 통해 해당 라이브러리 함수를 사용할 수 있다.
이때 The type or namespace name 'DllImport' could not be found
에러를 방지하기 위해
using System.Runtime.InteropServices;
코드를 상단에 추가해야 한다.
그리고 기존에 작성한 AndroidPlugin.cs
파일에서 showToast 함수에 코드 한 줄을 추가했다.
...
using static AndroidNativePlugin;
public class AndroidPlugin : MonoBehaviour
{
...
public void showToast(string message) {
...
AndroidNativePlugin.RootCheck();
}
}
실행 결과 Nox
에서는 루팅 탐지가 되지 않아 토스트가 보이고
Galaxy S10E
에서는 루팅이 탐지되어 종료되는 것을 볼 수 있다.