[Unity][AOS] Creating an Android Plugin for Unity (2/2)

koo00·2022년 6월 27일
0

Unity Plugin

목록 보기
2/4

유니티에서 안드로이드 플러그인을 만들고 사용하는 방법에 관한 포스팅이다.
지난 포스팅에 이어 이번 포스팅에서는 네이티브 플러그인 사용 방법에 대해 다룬다.

테스트 환경은 다음과 같으며 지난 번에 사용한 프로젝트를 동일하게 활용할 예정이다.
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 에서는 루팅이 탐지되어 종료되는 것을 볼 수 있다.

profile
JFDI !

0개의 댓글