반응형

1. 특정 자바 클래스 파일에 우선 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 로 정의를 했는지를 확인한다.

반응형