본문 바로가기
반응형

JNI3

[JNI] Java -jar로 실행시 C언어에서 findClass시 NoClassDefFoundError 발생 해결방법 gradle bootRun으로 실행했을때 문제없었지만 jar로 실행시 NoClassDefFoundError가 발생했는데 차이는 클래스 로드방식때문입니다. Java VM은 JNI_OnLoad 함수를 호출하여, JNI 라이브러리를 초기화합니다. 이 때, 클래스를 전역변수로 저장하는 이유는, Java VM에서 클래스를 로딩하고, JNI 함수에서 사용하기 위함입니다. Java 클래스는 Java VM에서 관리되며, Java 클래스는 클래스 로더(Class Loader)에 의해 로딩됩니다. JNI 함수에서 Java 클래스를 사용하기 위해서는, Java 클래스를 로딩하고, 해당 클래스의 메서드나 필드에 접근해야 합니다. JNI_OnLoad 함수는 JNI 라이브러리를 초기화하는 시점에서 호출되므로, 이 함수에서 Jav.. 2023. 3. 16.
[JNI] C에서 JAVA 코드를 호출하는 방법 C에서 JAVA 코드를 호출하기위해서는 jvm이 필요합니다. java에서 dll 이나 so를 로드하게 되면 c의 JNI_Onload 코드가 호출되게 된다. 이때 우선 jvm을 전역변수로 저장해둡니다. static JavaVM* jvm; JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { jvm = vm; return JNI_VERSION_1_8; } 그런다음 자바에 c언어에서 호출될 클래스와 메서드를 만듭니다. @Slf4j public class TestHandler { public TestHandler() { } public void testHandler(String str) { log.info(str); } } 이제 저장해둔 jvm을 이용.. 2023. 3. 15.
[JNI] JNI를 이용한 JAVA에서 C API 호출 JNI를 이용하기 C API를 호출하는 기본 구조를 구현해보겠습니다. 우선 C파일에 JAVA에서 호출할수 있는 간단한 함수를 아래와 같이 구현합니다. JNI를 사용하기 위한 jni.h 파일은 java에 include 폴더에 있으니 참고하세요 JNIEXPORT jstring JNICALL Java_com_test_jni_JNITest_getHelloWorld(JNIEnv *jenv, jclass jcls) { jstring jresult = (*jenv)->NewStringUTF(jenv, (const char *)"Hello World"); return jresult; } 기본구조는 JNIEXPORT로 시작하여 return type JNICALL JAVA_패키지명순서대로_클래스명_메소드명 이런식으로 구현.. 2023. 3. 13.
반응형