JNI
[JNI] JNI를 이용한 JAVA에서 C API 호출
Apère
2023. 3. 13. 22:15
반응형
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_패키지명순서대로_클래스명_메소드명 이런식으로 구현해야합니다. 이렇게 파일을 만들고 빌드를 해서 dll 혹은 so 파일을 만듭니다
여기까지 구현을 했다면 다음으로 java에서 패키지 구조와 파일명 메소드명을 일치시켜 만들어줍니다. com.test.jni 패키지 하위에 아래와 같은 파일을 구현합니다. C 함수에 있던 *jenv, jcls는 자동으로 처리되는 파라미터이므로 java에서는 넘기는 파라미터가 없습니다. 그리고 native 를 이용해서 작성해야 합니다.
public class JNITest {
public final static native String getHelloWorld();
}
이제 아래처럼 동적 라이브러리를 로드하면 spring에서도 c API를 사용할수 있습니다. 동적라이브러리를 로드하려면 경로를 환경변수를 지정하거나 -Djava.library.path=경로를 지정해야 합니다. 참고로 리눅스 환경에서는 lib라이브러리명.so 처럼 이름앞에 lib을 붙여야됩니다
@SpringBootApplication
public class TestApplication {
static {
try {
System.loadLibrary("동적라이브러리명");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load.\n" + e);
System.exit(1);
}
}
public static void main(String[] args) {
TestApplication.run(TestApplication.class, args);
}
}
@RestController
public class TestController {
@GetMapping("/test")
public String getHelloWorld() throws Exception {
return JNITest.getHelloWorld();
}
}
이런식으로 JNI를 이용해서 RestAPI를 구성할수도 있습니다.
반응형