IT 이모저모

Android Native Plugin : Anroid Studio 사용해서 java 플러그인 만들기

exien 2018. 5. 10. 15:35

Android Native Plugin

"Native Plugins은 플랫폼 별 네이티브 코드 라이브러리입니다." ( Unity Manual )

Android Native Plugin을 사용하면 Android 특정 기능에 액세스 할 수 있습니다. 예를 들어, 네이티브 대화 상자 및 선택기, 토스트, 모바일 카메라 등과 같은 기능을 사용하려면 플러그인이 필요합니다.

네이티브 플러그인을 만들고 사용하려면 Unity와 원하는 플랫폼 사이에 통신을 설정해야합니다.

플랫폼 측면에서는 특정 언어로 함수를 작성합니다. Android에서는 언어가 Java이고 iOS에서는 Objective-C입니다.

이 튜토리얼에서는 Android Native Plugin을 빌드하고 이후에는 iOS에 접근 할 것이다.


1 단계. Android Studio 프로젝트

새 프로젝트 마법사

새로운 Android Studio 프로젝트를 만들고 응용 프로그램 이름 과 회사 도메인을 선택하십시오 .

Android Native Plugin : 애플리케이션 이름과 회사 도메인으로 새 프로젝트를 구성하십시오.
이미지 1. 응용 프로그램 이름과 회사 도메인으로 새 프로젝트를 구성하십시오.

다음으로 프로젝트 의 최소 SDK 버전 을 선택해야합니다 제안 된 버전에서 나갈 수 있습니다.

Android Native Plugin : 최소 SDK 버전을 선택합니다.
Image 2. 최소 SDK 버전을 선택하십시오.

마지막으로, 마지막 단계에서 프로젝트에 기본 활동을 추가 할 수 있습니다. 이 경우 "활동 없음 추가" 옵션 을 선택하는 것이 좋습니다 .

Android Native Plugin : 활동 없음 추가 옵션을 선택합니다.
이미지 3. 활동 없음 추가 옵션을 선택하십시오.

build.gradle 파일

플러그인을 Unity로 가져 오려면 app 모듈을 라이브러리 로 변환해야합니다 .

모듈 build.gradle 파일을 엽니 다 .

앱 모듈의 build.gradle 파일은 끝에 (Module : app)가있는 파일입니다. 또 다른 하나는 전체 프로젝트의 빌드 파일입니다.

Android Native Plugin : 앱 모듈 build.gradle 파일을 엽니 다.
Image 4. 앱 모듈 build.gradle 파일을 엽니 다.

build.gradle 파일을 다음과 같이 변경 하십시오.

라이브러리를 Unity로 가져 오려면 .java 클래스를 .class 파일로 컴파일 한 다음 .jar 파일 로 패키지화해야 합니다 . 

컴파일 된 클래스를 .jar 아카이브로 패키징하기 위해 몇 가지 새로운 gradle 작업 을 만들어 보겠습니다 .

build.gradle 파일 의 끝에 다음 코드를 추가하십시오.

다음은 코드의 분석입니다.

작업  exportJar .jar 파일을 기본 디렉토리에서 새 릴리스 디렉토리로 복사하고 AddComponentNative.jar (또는 원하는 이름)로 이름을 바꿉니다 .

task  deleteOldJar : 릴리스 디렉토리에서 .jar 파일을 삭제합니다.

exportJar.dependsOn는  차종 exportJar의 의 성공적인 결론 후에 실행 작업 deleteOldJar 과 빌드 작업을. 따라서 실행될 때마다 마지막 .jar 이 삭제 되고 모듈이 빌드 된 다음 새 .jar 파일의 이름이 바뀌고 복사 됩니다.

이제 Gradle Tool 창을 엽니 다  다음과 같은 경로에 도달 할 때까지 그것을 확장  응용 프로그램 / 작업 / 기타 : UnityNativePlugin /및 실행 (더블 클릭)를 exportJar의 작업을.

Gradle Tool 창은 IDE의 오른쪽에서 선택하거나 View / Tool Windows / Gradle 메뉴에서 선택하여 확장 할 수 있습니다.

Android Native Plugin : 계층 구조를 확장하여 exportJar 작업에 도달합니다.
Image 5. 계층 구조를 확장하여 exportJar 태스크를 찾습니다.

작업이 오류없이 완료되면 (나는 그렇게되기를 바랍니다) <project directory> / app / release 내에 새로운 .jar 파일 이 있어야합니다 .

Android Native Plugin : 릴리스 디렉토리에서 내 보낸 .jar 파일을 확인하십시오.
Image 6. 릴리스 디렉토리에서 내 보낸 .jar 파일을 확인하십시오.

2 단계. Android 기본 코드

classes.jar 파일

먼저 Unity Android와 함께 제공된 classes.jar을 프로젝트로 가져와야합니다 .

다음 위치에서 찾을 수 있습니다.

Windows

C : \ Program Files \ Unity \ Editor \ Data

 / Applications / Unity라는 하위 폴더에 PlaybackEngines / AndroidPlayer / Variations / mono 또는 il2cpp / Development 또는 Release / Classes /

classes.jar 파일을 복사 하여 app 모듈 내부의 libs 디렉토리에 붙여 넣습니다 .

Android Native Plugin : 프로젝트보기로 변경합니다.
이미지 7. 프로젝트보기로 변경하십시오.

참고 :보기를 Project로 변경하여 libs 디렉토리를 볼 수 있습니다. 기본적으로 Android보기를 사용해야합니다.

Android Native Plugin : classes.jar 파일을 libs 디렉토리에 붙여 넣습니다.
Image 8. classes.jar 파일을 libs 디렉토리에 붙여 넣으십시오.

classes.jar도  플러그인 파일에 포함시켜야 합니다. 따라서 build.gradle을 열고  다음 줄을 추가하십시오.

마지막으로 실제로 코딩을 시작하기위한 모든 작업이 완료되었습니다.

이 튜토리얼에서는 Android와 Unity간에 데이터를 앞뒤로 전달하는 방법에 대한 여러 가지 예를 살펴 보겠습니다. 그러나이 아이디어는 그러한 의사 소통을 구현하는 기초를 보여주는 것입니다.

이런 식으로 주어진 예제는 네이티브 대화를 보여주는 것처럼 실제 필수품을 해결하지 못할 것입니다. 그러나 Android Native Plugin을 만드는 기본 개념을 보여줄 것입니다.

이후 포스트에서는 Android Native Plugin을 사용하여 "실제 상황"을 해결하는 방법에 대한 몇 가지 예를 살펴 보겠습니다. 그러니 나와 함께 참아주십시오.

프로젝트의 Android보기로 돌아 가면 구조보기에서 덜 혼란스러워집니다.

Examples.java 파일

Examples.java 클래스를 작성하십시오 .

Android Native Plugin : 패키지 이름의 RMB를 눌러 상황에 맞는 메뉴에 액세스하고 새 Java 클래스를 만듭니다.
Image 9. 패키지 이름의 RMB을 눌러 컨텍스트 메뉴에 액세스하고 새 Java 클래스를 작성하십시오.
Android Native Plugin : Kind Class의 Examples라는 새 새 클래스를 만듭니다.
Image 10. Kind Class의 Examples라는 새 클래스를 새로 만든다.

먼저, Android 측 에 무언가 를 기록 하는 몇 가지 메소드를 추가해 보겠습니다  .

sayMyname 이라는 새로운 공용 메서드를 만들어 void 를 반환 하고 인수를 허용 하지 않습니다 . void 를 반환 하고 문자열 인수를받아들이는 sayItLikeJesse 라는 또 다른 공용 메서드를 만듭니다 .

실제로 TAG 변수는 필요 없지만 로그 태그에 변수를 정의하는 것을 선호합니다.

이 두 가지 방법 모두 콘솔에 무언가를 기록하지만 아무 것도 반환하지 않습니다. 그래서 호출 될 때  을 반환하는 또 다른 것을 추가합시다 .

이 함수를 호출 할 때마다 임의로 결과 중 하나를 반환합니다.

getRandomNumber 함수는이 예제를 좀 더 재미있게 만드는 약간의 부가 기능입니다 (예, 알고 있습니다. 여전히 booooring입니다).

UnitySendMessage 메서드

이제 다음 예제를 상상해보십시오.

기본 날짜 선택 대화 상자를 표시하고 선택한 날짜를 Unity 측으로 반환하는 함수가 필요합니다.

우리가 향후 게시물에서 그것에 대해 이야기 할 것이기 때문에이 예를 명심하십시오.

이 예제에서는 호출 할 때 선택한 날짜를 사용할 수 없기 때문에 마지막 함수와 같은 것을 사용할 수 없습니다. 따라서 기본 대화 상자를 표시하는 함수가 필요하지만 결과를 사용할 수 없으므로 준비가되면 선택한 날짜를 Unity에 전달해야합니다.

java 클래스 com.unity3d.player.UnityPlayer 에는 java에서 Unity로 데이터를 보낼 수있는 UnitySendMessage 라는 정적 메서드가 있습니다.

메소드 서명 분류 :

  1. 대상 GameObject의 이름 : 데이터를 수신 할 스크립트가있는 게임 객체입니다  .
  2. 그것을받을 메소드의 이름 : 대상 GameObject에 적용된 모든 스크립트에 존재해야합니다.
  3. 메시지 문자열 인수 : 보내려는 데이터. 

수신 방법은 다음 서명 MethodName (문자열 메시지)과 일치해야합니다.

새로운 방법을 만들고 UnitySendMessage 를 사용하여 데이터를 다시 Unity로 보내 봅시다 .

GameObject와 Method 이름을 인수로 전달할 필요는 없지만 항상 유연합니다.

지금까지는 모든 예제가 정적이 아닌 메소드이므로 예제 클래스  의 인스턴스 가 필요합니다.

마지막 예제는 Unity 측에서 Java에서 정적 메서드 를 호출하는 것 입니다.

다음 메소드를 작성하십시오.

마지막으로 자바 측이 완성되었습니다.

모든 것이 작동하는지 확인하기 위해 .jar 파일 을 내보내십시오 .

다음은 완전한 Examples.java 파일입니다.

3. Unity Project

새 유니티 프로젝트 와 새로운 장면을 만들고 Assets 폴더 안에 다음 디렉토리 인 Plugins / Android를 추가하십시오 .

Android Native Plugin : 플러그인 / Android 경로를 만듭니다.
이미지 11. 플러그인 / Android 경로를 만듭니다.

AddComponentNative.jar의 파일은 안드로이드 폴더 안에 갈 필요가있다. 릴리스 폴더에서 Unity로 드래그하거나 가장 멋진 방법은 Android build.gradle에서 복사 경로를 수정하여 .jar 이 빌드 될 때 Unity 폴더에 자동으로 복사되도록하는 것입니다. 후자와 함께 가자.

Android Studio로 돌아가서 build.gradle 파일을 열고 다음과 같이 변경합니다.

모든 것이 원활하게 돌아가고 있는지 테스트하십시오.

Android Native Plugin : Plugins / Android 폴더 내에 .jar 파일이 있는지 확인하십시오.
Image 12. Plugins / Android 폴더 내에 .jar 파일이 있는지 확인하십시오.

4. 유니 코드

이제 Unity 내부에 .jar 파일 이 생겼 으므로 새로운 구성 요소 가 필요 합니다. NativeAndroid.cs  (또는 원하는대로) 라는 새로운 MonoBehaviour를 만듭니다 .

Android Native Plugin : 새 MonoBehaviour.cs를 만듭니다.
이미지 13. 새로운 MonoBehaviour.cs 파일을 만듭니다.

새로운 스크립트를 장면의 GameObject 에 할당하십시오 .

Android Native Plugin : 장면의 GameObject에 적용하십시오.
Image 14. 씬의 GameObject에 적용하십시오.

새 스크립트를 열고 Java에서 호출 할 수있는 메소드를 추가해 보겠습니다.

Java 코드에 액세스하려면 Java 또는 JVM과 원시 코드 간의 상호 작용을 허용 하는 JNI ( Java Native Interface ) 를 사용해야합니다 그러나 JNI를 직접 사용할 필요는 없습니다. 대신, 우리는 헬퍼 클래스의 몇이  AndroidJavaObject 과  AndroidJavaClass를 JNI와의 상호 작용을 용이하게하기 위해,.  이 두 클래스는 대부분의 작업을 자동화합니다 (이 주제에 대해서는 자세하게 설명하지는 않겠지 만, Unity  Manual이 그것에 대해 무엇 을 말하고 있는지 확인해보십시오  ).

Android 에서 sayMyName 함수 를 호출하는 메소드를 작성하십시오 .

단일성 (C #)

Android (자바)

은 Using AndroidJavaObject을 우리는 새로운 만들 예를 원하는 자바 클래스 (Examples.java)의합니다. 새 인스턴스를 만들려면 전체 패키지 이름 을 객체 생성자 에 전달해야합니다 .

그런 다음 객체 참조 를 사용하여 해당 클래스에 정의한 메서드 (예 : MyName ) 를 호출합니다 .

메소드 이름은 Java에서 정의 된 메소드 이름과 정확히 같아야하며 그렇지 않으면 발견되지 않습니다.

Unity Manual에 따르면, 모든 AndroidJavaObject 및 AndroidJavaClass 인스턴스를 using () {} 문 내에 유지하여 가능한 빨리 가비지 컬렉터가 해당 인스턴스를 삭제하는지 확인해야합니다.

두 번째 함수 인  sayItLikeJesse  는 마지막 것과 유사하지만 문자열 인수를 허용합니다. 여러 개의 인수로 AndroidJavaObject.Call메소드를 호출 할 수 있습니다 Java에서 선언 된 것과 일치하는지 확인하십시오.

단일성 (C #)

Android (자바)

입력 필드의 텍스트를 문자열 인수로 전달합니다. 이 함수를 테스트하기 위해 만든 간단한 UI를 보여 드리겠습니다.

다음 메소드 인 whoAreYou 는 string 유형 의 리턴 값 을가집니다 . 비 void 반환 형식의 메서드를 호출하려면 원하는 반환 형식을 나타내는 generic 을 사용합니다 .

마지막 메서드 다음에 다음 메서드를 추가하십시오.

단일성 (C #)

Android (자바)

메소드 whatsThePoint 는 UnitySendMessage를 사용하여 Unity에 데이터를 전송합니다 Unity에 대한 데이터를 받으려면 MonoBehaviour  에 서명 MethodName (문자열 메시지)이 있는 메소드를 선언해야합니다  그리고 장면 의 GameObject 에 스크립트를 할당해야합니다 .

UnitySendMessage는 의 이름을 알 필요가 게임 오브젝트 와의 이름 방법 . Java에서 정의하거나 Unity에서 인수로 전달할 수 있습니다. 이 경우, 후자를 사용합시다.

단일성 (C #)

Android (자바)

우리는 자바의 whatsThePoint 메서드를 호출하여 GameObject 이름 인 NativeBridge와 메서드 이름 인 WhatsThePointReceived 를 인수로 전달합니다 .

UnitySendMessage 에서 보낸 데이터 는 WhatsThePointReceived 메서드 (MethodName (문자열 메시지))에 의해 수신됩니다 .

이 경우 함수를 호출하는 스크립트와 동일한 스크립트에서 수신 방법을 선언했지만 어디에서나 선언 할 수 있습니다. 장면의 GameObject에 할당하고 UnitySendMessage에 정확한 이름을 전달하는 한.

마지막 메소드는 정적 메소드 이기 때문에 다른 메소드와 다릅니다 대신 AndroidJavaObject의 정적 메소드를 호출하기 위해, 우리는 필요 예를 의 AndroidJavaClass을 .

단일성 (C #)

Android (자바)

이 코드는 마지막 예와 유사하지만, 대신 AndroidJavaObject의 우리가 사용 AndroidJavaClass 우리가 사용하는 대신 전화의 CallStatic의 방법을.

마지막으로 코드가 준비되었습니다. 그것을 실행하자!

다음은 C # 스크립트의 정식 버전입니다.

5. 달리고 놀랄 준비를하십시오!

이러한 기능을 테스트하려면 실제 Android 기기 에서 실행해야합니다 따라서 Button, Labels 및 Input Fields가 포함 된 기본 UI를 만들었습니다. 당신은 아마 이미 이것을 만드는 법을 알고 있습니다, 그래서 결과는 다음 이미지와 같이 보일 것입니다.

Android Native Plugin : 플러그인을 테스트 할 UI를 만듭니다.
Image 15. 플러그인을 테스트 할 UI를 생성한다.

각 버튼은 GameObject NativeBridge에 할당 된 NativeAndroid.cs 스크립트 에서 동일한 이름의 함수를 호출합니다 .

"내 이름을 말하십시오", "제시와 똑같이 말하십시오", "말하기"는 Android Studio Logcat에 텍스트를 기록합니다. "당신은 누구입니까?"와 "요점은 무엇입니까?"문자열 값을 받고 그 밑의 레이블에 표시합니다.

당신은 변경해야하는 안드로이드 장치에 응용 프로그램을 실행하려면 플랫폼 상의 빌드 설정.

Android Native Plugin : 빌드 설정 (파일 / 빌드 설정)을 열고 플랫폼을 Android로 변경합니다.
이미지 16. 빌드 설정 (파일 / 빌드 설정)을 열고 플랫폼을 Android로 변경하십시오.

그런 다음 플레이어 설정 에서 번들 식별자 를 지정 합니다 .

Android Native Plugin : 플레이어 설정 (Edit / Project Settings / Player)을 열고 기타 설정 섹션에서 Bundle Identifier를 설정하십시오.
Image 17. 플레이어 설정 (편집 / 프로젝트 설정 / 플레이어)을 열고 기타 설정 섹션에서 번들 식별자를 설정하십시오.

이제 실제 Android 기기에서 테스트하기 위해 프로젝트를 빌드하고 실행할 수 있습니다.

수표의 장치 로그 안드로이드에 열 안드로이드 스튜디오를 , 선택 안드로이드 모니터 화면의 하단과에 로그 캣의 탭을 선택합니다.

Android Native Plugin : Android Studio에서 logcat을 엽니 다.
Image 18. Android Studio에서 logcat을 엽니 다.

Log.d 함수에 사용 된 태그를 검색하여 로그를 필터링 할 수 있습니다.

이것은 Unity를위한 Android Native Plugin을 만드는 것에 대한 매우 기본적인 튜토리얼입니다. Android UnityPlayerActivity를 확장하고 대화 상자, 토스트 및 카메라와 같은 Android 기본 기능에 실제로 액세스하는 것과 같이 탐색 할 더욱 복잡한 주제가 있습니다. 그러나 우리는 이제 기본이 이미 계획되어 있기 때문에 이러한 주제로 확장하는 것이 더 쉬울 것이라고 믿습니다.

'IT 이모저모' 카테고리의 다른 글

차세대 메모리 UFS  (0) 2018.06.29
퀄컴 - 스냅드래곤 855  (0) 2018.05.15
Improved Alpha-Tested Magnification for Vector Textures and Special Effects  (0) 2018.05.09
Unity 로그 출력안하기  (0) 2018.05.09
메모리 최적화  (0) 2018.05.09