현재 위치 - 중국 분류 정보 발표 플랫폼 - 비즈니스 서비스 정보 - Android NDK 개발 소개 NDK, SDK, JNI의 관계는 무엇인가요?

Android NDK 개발 소개 NDK, SDK, JNI의 관계는 무엇인가요?

NDK: Android NDK는 SDK, 즉 Native Development Kit 앞에 'native'라는 단어를 추가하여 Google에서는 'NDK'라고도 부릅니다.

NDK의 전체 이름: Native Development Kit.

NDK는 도구 모음입니다.

* NDK는 개발자가 C(또는 C++) 동적 라이브러리를 빠르게 개발하는 데 도움이 되는 일련의 도구를 제공하며 so 및 java 애플리케이션을 apk로 자동 패키징할 수 있습니다. 이러한 도구는 개발자에게 큰 도움이 됩니다.

* NDK는 크로스 컴파일러를 통합하고 해당 mk 파일을 제공하여 CPU, 플랫폼, ABI 등의 차이점을 격리합니다. 개발자는 mk 파일만 수정하기만 하면 됩니다("어떤 파일을 컴파일해야 하는지 지적) ", "컴파일 기능 요구 사항" 등)을 생성할 수 있습니다.

* NDK는 자동으로 Java 애플리케이션과 Java 애플리케이션을 함께 패키징할 수 있으므로 개발자의 패키징 작업이 크게 줄어듭니다.

사실:

NDK는 .so 파일을 편리하고 빠르게 개발할 수 있는 도구입니다. JNI의 프로세스는 상대적으로 복잡하고 .so를 생성하려면 많은 작업이 필요하지만 NDK는 이 프로세스를 단순화합니다.

Android SDK:

SDK(소프트웨어 개발 키트) 소프트웨어 개발 키트. 소프트웨어 개발 엔지니어가 특정 소프트웨어 패키지, 소프트웨어 프레임워크, 하드웨어 플랫폼, 운영 체제 등을 위한 응용 프로그램 소프트웨어를 구축하는 데 사용하는 개발 도구 모음입니다. 그러므로! Android SDK는 Android 전용 소프트웨어 개발 키트를 나타냅니다.

JNI:

JNI(Java Native Interface) 표준은 Java 플랫폼의 일부로, 이를 통해 Java 코드를 다른 언어로 작성할 수 있습니다. 상호 작용할 언어. JNI는 Java Virtual Machine(VM) 내에서 실행되는 Java 코드가 C, C++, 어셈블리 언어 등 다른 프로그래밍 언어로 작성된 애플리케이션 및 라이브러리와 상호 운용될 수 있도록 하는 기본 프로그래밍 인터페이스입니다.

물론, 일반적으로 다음 작업 프로세스가 필요합니다.

1) Java 프로그램 작성: 여기서는 HelloWorld를 예로 들어 보겠습니다. Java 코드에서 c 함수 printf를 호출하려면

코드 1:

class HelloWorld {

public Native void testHelloWorld();

static {

System.loadLibrary("hello");

}

public static void main(String[] args) {

new HelloWorld().testHelloWorld() ;

}

}

네이티브 메서드 선언: 메서드를 네이티브 메서드로 만들려면 해당 메서드를 네이티브로 선언해야 합니다. 실현되다.

동적 라이브러리 로드: System.loadLibrary("hello");

이것은 일반적으로 정적 블록과 함께 로드됩니다. 동시에 System.loadLibrary()의 "hello" 매개변수는 동적 라이브러리의 이름이라는 점에 유의해야 합니다.

2) 컴파일

javac HelloWorld.java

3) 확장자가 h인 헤더 파일 javah를 생성합니까?

JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld (JNIEnv *, jobject);

이 h 파일은 Java의 인터페이스와 동일합니다. 여기서는 Java_HelloWorld_testHelloWorld(JNIEnv *, jobject) 메소드를 선언한 다음 이 메소드를 로컬 메소드에 구현합니다. 즉, C/C++ 프로그램을 작성할 때 사용하는 메소드 이름은 여기에 있는 이름과 일치해야 합니다.

4) javah 명령으로 생성된 헤더 파일에 선언된 메소드와 동일한 이름의 메소드를 구현하는 로컬 메소드를 작성합니다.

코드 2:

#include "jni .h"

#include "HelloWorld.h"

#include 다른 헤더

JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld(JNIEnv *env, jobject obj)

{

printf("Hello world!/n");

return;

}

< p>Note code 2 첫 번째 줄에서는 jni.h(이 파일은 %JAVA_HOME%/include 폴더에서 찾을 수 있음) 파일을 소개해야 합니다. 프로그램의 JNIEnv, jobject 및 기타 유형이 이 파일에 정의되어 있기 때문입니다. 헤더 파일; 추가로 2번째 줄에는 HelloWorld.h 헤더 파일이 도입되어야 합니다. 그런 다음 HelloWorldImpl.c로 저장하면 괜찮습니다.

5) 동적 라이브러리 생성

여기서는 Windows를 예로 들어 dll 파일을 생성해야 합니다. HelloWorldImpl.c가 저장된 폴더 아래에 VC 컴파일러를 이용하여 컴파일합니다. cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 참고: 생성된 dll 파일 이름은 -Fe 옵션 뒤에 구성됩니다. 여기서는 Hello가 HelloWorld에 있기 때문입니다. java 파일 라이브러리를 로드할 때 사용하는 이름은 hello입니다.

추가로 4단계에서 로컬 메소드 작성 시 jni.h 파일이 도입되기 때문에 -I%java_home%/include -I%java_home%/include/win32 매개변수를 추가해야 합니다. .

부적절한 비유: JNI는 음식을 직접 구매하고, 씻고, 볶고, 요리해야 하는데 NDK는 전화 한 통이면 매우 번거롭습니다.