샘플: hello-jni
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
이 샘플에서는 NDK로 빌드한 작은 C/C++ 애플리케이션인 hello-jni를 살펴봅니다. 이 샘플은 android-mk 브랜치 내 ndk-samples 저장소의 hello-jni 디렉터리에 있습니다.
Android.mk
다음 두 줄은 네이티브 소스 파일 이름과 빌드할 공유 라이브러리 이름을 제공합니다. 빌드 시스템에서 lib
접두사와 .so
확장자를 추가하면 빌드된 라이브러리의 전체 이름은 libhello-jni.so
가 됩니다.
LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE := hello-jni
Android.mk
파일의 역할과 이 파일을 사용하는 방법에 관한 자세한 내용은 Android.mk를 참조하세요.
Application.mk
이 줄은 빌드 시스템에 어떤 CPU와 아키텍처에 대해 빌드할지 알려줍니다. 이 예에서는 빌드 시스템이 모든 지원 아키텍처를 대상으로 빌드합니다.
APP_ABI := all
Application.mk
파일과 그 사용 방법에 관한 자세한 내용은 Application.mk를 참조하세요.
자바 측 구현
helloJNI.java
파일은 hellojni/src/com/example/hellojni/
에 있습니다. 함수를 호출하여 네이티브 측에서 문자열을 가져온 후 화면에 표시합니다.
소스 코드에는 NDK 사용자의 관심을 끄는 세 줄이 포함되어 있습니다.
본문에는 이들이 줄 순서가 아니라 사용된 순서대로 나와 있습니다.
이 함수를 호출하면 애플리케이션 시작 시 .so
파일이 로드됩니다.
Kotlin
System.loadLibrary("hello-jni")
자바
System.loadLibrary("hello-jni");
이 메서드 선언에서 native
키워드는 함수가 공유 라이브러리에 있음(즉, 네이티브 측에 구현되어 있음)을 가상 머신에 알려줍니다.
Kotlin
external fun stringFromJNI(): String
자바
public native String stringFromJNI();
Android 프레임워크는 이전 단계에서 로드되어 선언된 함수를 호출하고 화면에 이 문자열을 표시합니다.
Kotlin
tv.text = stringFromJNI()
Java
tv.setText( stringFromJNI() );
C측 구현
hello-jni.c
파일은 hello-jni/jni/
에 있습니다. 여기에는 자바 측에서 요청한 문자열을 반환하는 함수가 포함되어 있습니다. 함수 선언은 다음과 같습니다.
JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
이 선언은 자바 소스 코드에 선언된 네이티브 함수에 상응합니다. 반환 유형 jstring
은 자바 네이티브 인터페이스 사양에 정의된 데이터 유형입니다. 이 유형은 실제 문자열이 아니라 자바 문자열을 가리키는 포인터입니다.
jstring
뒤에는 함수 이름이 나옵니다. 함수 이름은 자바 함수 이름 및 함수가 포함된 파일의 경로를 기반으로 합니다. 다음 규칙에 따라 함수 이름을 구성합니다.
- 앞에
Java_
를 추가합니다.
- 최상위 소스 디렉터리에 상대적인 파일 경로를 설명합니다.
- 슬래시 대신 밑줄을 사용합니다.
.java
파일 확장자를 생략합니다.
- 마지막 밑줄 뒤에 함수 이름을 덧붙입니다.
이러한 규칙에 따라 이 예에서는 함수 이름 Java_com_example_hellojni_HelloJni_stringFromJNI
를 사용합니다. 이 이름은 stringFromJNI()
라는 자바 함수를 가리키며 이 함수는 hellojni/src/com/example/hellojni/HelloJni.java
에 있습니다.
JNIEnv*
는 VM을 가리키는 포인터이고 jobject
는 자바 측에서 전달된 암시적 this
객체를 가리키는 포인터입니다.
다음 줄은 VM API (*env)
를 호출하여 여기에 반환 값을 전달합니다. 여기서 반환 값은 자바 측의 함수가 요청한 문자열입니다.
return (*env)->NewStringUTF(env, "Hello from JNI !
Compiled with ABI " ABI ".");
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-26(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-26(UTC)"],[],[],null,["# Sample: hello-jni\n\nThis sample guides you through hello-jni, a minimal\nC/C++ application built with the NDK. This sample is in the [hello-jni](https://github.com/android/ndk-samples/tree/android-mk/hello-jni) directory\nof ndk-samples repo, inside [android-mk branch](https://github.com/android/ndk-samples/tree/android-mk).\n\nAndroid.mk\n----------\n\nThe following two lines provide the name of the native source file, along\nwith the name of the shared library to build. The full name of the built\nlibrary is `libhello-jni.so`, once the build system adds the\n`lib` prefix and the `.so` extension. \n\n```\nLOCAL_SRC_FILES := hello-jni.c\nLOCAL_MODULE := hello-jni\n```\n\nFor more information about what the `Android.mk` file does, and how to use it, see\n[Android.mk](/ndk/guides/android_mk).\n\nApplication.mk\n--------------\n\nThis line tells the build system the CPU and architecture against which to build. In this\nexample, the build system builds for all supported architectures. \n\n```\nAPP_ABI := all\n```\n\nFor more information about the `Application.mk` file, and how to use it, see\n[Application.mk](/ndk/guides/application_mk).\n\nJava-side Implementation\n------------------------\n\nThe `helloJNI.java` file is located in `hellojni/src/com/example/hellojni/`. It calls\na function to retrieve a string from the native side, then displays it on the screen.\n\nThe source code contains three lines of particular interest to the NDK user.\nThey are presented here in the order in which they are used, rather than by\nline order.\n\nThis function call loads the `.so` file upon application startup. \n\n### Kotlin\n\n```kotlin\nSystem.loadLibrary(\"hello-jni\")\n```\n\n### Java\n\n```java\nSystem.loadLibrary(\"hello-jni\");\n```\n\nThe `native` keyword in this method declaration tells the\nvirtual machine that the function is in the shared library (that is, implemented on the native\nside). \n\n### Kotlin\n\n```kotlin\nexternal fun stringFromJNI(): String\n```\n\n### Java\n\n```java\npublic native String stringFromJNI();\n```\n\nThe Android framework calls the function loaded and declared in the\nprevious steps, displaying the string on the screen. \n\n### Kotlin\n\n```kotlin\ntv.text = stringFromJNI()\n```\n\n### Java\n\n```java\ntv.setText( stringFromJNI() );\n```\n\nC-side Implementation\n---------------------\n\nThe `hello-jni.c` file is located in `hello-jni/jni/`. It contains a function that\nreturns a string that [the Java side requested](#ji)). The function declaration is as\nfollows: \n\n```c++\nJNIEXPORT jstring JNICALL\nJava_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,\n jobject thiz )\n```\n\nThis declaration corresponds to the native function declared in the\nJava source code. The return type, `jstring`, is a data type defined\nin the\n[Java Native\nInterface Specification](http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html). It is not actually a string, but a\npointer to a Java string.\n\nAfter `jstring` comes the function name, which is based on the\nJava function name and the path to the file containing it. Construct it\naccording to the following rules:\n\n- Prepend `Java_` to it.\n- Describe the filepath relative to the top-level source directory.\n- Use underscores in place of forward slashes.\n- Omit the `.java` file extension.\n- After the last underscore, append the function name.\n\nFollowing these rules, this example uses the function name\n`Java_com_example_hellojni_HelloJni_stringFromJNI`. This name refers to a Java\nfunction called `stringFromJNI()`, which resides in\n`hellojni/src/com/example/hellojni/HelloJni.java`.\n\n`JNIEnv*` is the pointer to the VM, and\n`jobject` is a pointer to the implicit `this` object passed from\nthe Java side.\n\nThe following line calls the VM API `(*env)`, and passes it a return value:\nthat is, the string that the function on the Java side had requested. \n\n```c++\nreturn (*env)-\u003eNewStringUTF(env, \"Hello from JNI !\nCompiled with ABI \" ABI \".\");\n```"]]