[Android][JNI] JNI 메소드 만들기 (Main)
2024. 7. 4. 01:201. 특정 자바 클래스 파일에 우선 public native void 함수명().. 만들기
2. 빨간 줄 위에 마우스 커서 올리고 Create JNI 클릭하기.
3, 이제 cpp파일 하나 만들고 cMakelists.txt에 해당 CPP 파일 추가해야하기
4, 이후 gradle sync 누르기
#JNI 메서드 만들기 #Android native
--------------- --------------- --------------- ---------------
Hello JNI 메서드 경로 확인해보기
https://github.com/liangzi10101/hello-java-jni/tree/main/Skia_Application/app/src
--------------- --------------- --------------- ---------------
절차
ChatGPT가 대답한 경로
project-root/
├── app/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/example/myapplication/MainActivity.java
│ │ │ ├── cpp/
│ │ │ │ ├── native-lib.cpp
│ │ │ │ ├── CMakeLists.txt
│ │ │ ├── res/
│ │ │ │ ├── layout/activity_main.xml
│ │ ├── AndroidManifest.xml
├── build.gradle
└── settings.gradle
----------------- --------------- --------------- ---------------
1. CMake 및 NDK 설정
build.gradle 파일을 수정하여 NDK와 CMake를 설정합니다.
android {
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
}
2. 네이티브 메서드 선언
자바 클래스에서 네이티브 메서드를 선언합니다.
public class NativeLib {
static {
System.loadLibrary("native-lib");
}
public native String stringFromJNI();
}
3. CMakeLists.txt 파일 작성
루트 디렉토리에 CMakeLists.txt 파일을 생성하고 다음 내용을 추가합니다.
(main/cpp 폴더를 생성한 후, 메뉴에서 CMakeLists.txt를 생성한다.)
cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
SHARED
native-lib.cpp )
find_library( log-lib
log )
target_link_libraries( native-lib
${log-lib} )
4. 네이티브 라이브러리 파일 작성
src/main/cpp 디렉토리에 native-lib.cpp 파일을 생성하고 다음 코드를 작성합니다.
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_NativeLib_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
만약 "This JNI function call may be using an incorrect linkage. " 에러가 뜬다면?,
패키지 이름을 수정해야한다.
BEFORE: Java_com_example_myapplication_NativeLib_stringFromJNI(
->
AFTER: Java_com_XXX_YYY_NativeLib_stringFromJNI(
5. 자바 코드에서 네이티브 메서드 호출
네이티브 메서드를 호출하여 결과를 확인합니다.
public class MainActivity extends AppCompatActivity {
private NativeLib nativeLib = new NativeLib();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.sample_text);
tv.setText(nativeLib.stringFromJNI());
}
}
테스트 해보기
아래처럼 stringFromJNI를 호출해보자. 그리고 그것을 Log로 출력해보자.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...............
Log.i("TEST123", stringFromJNI());
...............
}
public native String stringFromJNI();
}
아래처럼 잘 뜨는걸 확인할 수 있다.
Trouble Shooting
Trouble 1. "Cannot resolve corresponding JNI function Java_XXX_AAA_BBB_CCC_MainActivity_stringFromJNI. Could not find any C or C++ source files in the project. Please create one first. " 에러가 뜨는 이유
-> build.gradle 파일 설정 확인합니다.
여기서, path가 정확하게 썼는지 확인합니다!
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2" // CMake 버전 지정
}
}
}
dependencies {
...
}
Trobule 2. Cannot resolve corresponding JNI function Java_XXX_AAA_BBB_CCC_MainActivity_stringFromJNI _MainActivity_stringFromJNI.
-> 진짜로 CPP 파일에 선선된 메서드가 Java_XXX_AAA_BBB_CCC_MainActivity_stringFromJNI _MainActivity_stringFromJNI 로 정의를 했는지를 확인한다.
'Android > Android Native' 카테고리의 다른 글
[Android Native][JNI] CMakeLists.txt에 원하는 CPP파일 추가하기 (0) | 2024.08.09 |
---|---|
[Android Native] Abort message: 'JNI DETECTED ERROR IN APPLICATION: JNI ERROR (app bug): jclass is an invalid local reference: XXXX (0) | 2024.08.09 |
[Android] JNI method signature에 대한 고찰 (0) | 2024.08.09 |
[Android][JNI] 멀티쓰레드 관련 Stack overflow 정리 (0) | 2024.08.05 |
[Android][JNI] Native code에 로그 찍기 및 Logcat에 출력하게 하기 (0) | 2024.05.30 |