2010-12-07 4 views
10

Android NDK은 완전히 네이티브 C/C++ 코드로 안드로이드 응용 프로그램을 작성하기위한 지원을 포함하도록 크게 확장되었습니다. 하나는 이제 네이티브 코드를 사용하여 키보드 및 터치 스크린에서 입력 이벤트를 캡처 할 수 있으며 새로운 NativeActivity 클래스를 사용하여 C/C++에서 응용 프로그램 수명주기를 구현할 수도 있습니다.Android NativeActivity

확장 된 모든 기본 기능을 감안할 때 Java를 완전히 우회하여 원시 코드로 Android 애플리케이션을 작성하는 것이 가치가 있습니까?

답변

8

NDK는 고유 한 것이 아닙니다. Android SDK를 중심으로 JNI wrapper가 있습니다. NativeActivity를 사용하면 특정 앱 라이프 사이클 이벤트를 처리하고 사용자 고유의 코드를 맨 위에 추가 할 수 있습니다. ALooper, AInputQueue 등은 모두 Java SDK의 JNI 래퍼이며, 일부는 실제 앱에서 비공개로 액세스 할 수없는 추가 코드가 포함되어 있습니다.

Android 개발과 관련해서는 네이티브 C++로 애플리케이션을 작성하는 것과 같은 것이 없습니다. (모든 실제 앱 케이스에서) 항상 Android API를 사용해야합니다. 엄청난 정도로 순수 자바. Wether를 사용하면 NDK에서 제공하는 래퍼를 사용하거나 직접 만든 래퍼를 사용하여 실제로이 작업을 변경할 수 없습니다.

질문에 대답하자면 : 코드 호출이 적은 동일한 Java 메소드에 JNI 랩퍼를 작성하는 대신 SDK 호출을 위해 JNI 랩퍼를 작성하게되므로 가치가 없습니다. , 더 간단한 코드 및 더 빠른 코드. 예를 들어, "pure C++"를 사용하여 대화 상자를 표시하면 상당히 많은 JNI 호출이 필요합니다. 똑같은 일을하는 JNI를 통해 Java 메소드를 호출하면보다 빠른 코드 (JNI 호출 하나)를 얻을 수 있으며 유지 관리가 쉬운 코드라고 할 수 있습니다.

할 수있는 일을 완전히 이해하려면 Android 소스 코드를 조사해야합니다. NDK에서 사용할 수있는 native_app_glue.c로 시작한 다음, AActivity, ALooper, AInputQueue 등의 OS 구현을 계속 진행하십시오. Google 코드 검색은 이에 큰 도움이됩니다. :-)

Java에서하기 쉽고 많은 호출이 포함 된 경우 여러 JNI 호출로 모든 코드를 작성하는 대신 모든 작업을 수행하는 JNI를 통해 메소드를 호출하십시오. 기존의 C++ 코드를 그대로 인 것처럼 보존하십시오..

+6

대화 상자가 필요 없으며 UI가 100 % OpenGL로 그려진 OpenGL 게임을 만드는 경우 어떻게됩니까? NativeActivity를 사용하는 것이 더 합리적입니까? – Bram

+6

그 시나리오에서는 완벽하게 이해할 수 있습니다. –

4

방금 ​​표준 응용 프로그램을 만드는 경우가 아닙니다. Java SDK는 현재 네이티브보다 완벽하기 때문에 여전히 어렵게 만듭니다.

NDK가 필요한 항목 (읽기 : 실시간 성능 민감성)을 수행하지 않는 경우 Java를 사용하십시오.

2

iOS와 Android에서 앱을 사용하는 경우 C/C++ 코드가 공유 될 수 있습니다. 분명히 iOS Obj-C와 플랫폼 특정 코드는 다른 곳에서 작동하지 않습니다. (안드로이드 특정 물건에 대한 Ditto). 그러나 플랫폼 중립적 인 일부 공유 코드를 가질 수 있습니다.

3

가능한 경우 기본 활동을 지원하는 Android 버전이 설치된 기반의 상당 부분을 차지할 때까지 Java 스타일 앱을 고수하십시오.

이전에는 할 수 없었던 일, 특히 기존 코드의 포트에 대해서는 큰 도움이 될 것입니다.

씬 자바 래퍼를 작성하는 것보다 변경된 사항은 아직 명확하지 않습니다. 예를 들어, dalvik VM의 복사본이 계속 남아 있습니까?

+3

예 프로세스에 여전히 Dalvik VM이 있습니다. – hackbod

+1

그래서 무엇이 당신 자신의 얇은 자바 래퍼를 작성하게할까요? 진짜 뉴스가 있다면, 공개 된 네이티브 api가 될 것 같습니까? –

관련 문제