Java JNI Test
1. HelloWorld
가. Java
Test.java
public class Test {
public Test(){
} static{ System.loadLibrary("JniTest"); } public native static void getTest();
public static void main(String[] args){ Test test = new Test(); test.getTest(); } }
|
나. C++
Test.cpp
#include <jni.h> #include "Test.h" #include <iostream> /* * Class: Test * Method: getTest * Signature: ()V */ JNIEXPORT void JNICALL Java_Test_getTest (JNIEnv *, jclass jobj){
std::cout<<"Hello"<<std::endl; }
|
다. 순서
1) javah -jni Test (Test.h 헤더 파일 생성)
2) g++ -c -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux Test.cpp (Object 생성)
3) g++ -shared -o libJniTest.so Test.o (Dll/SO 파일 생성)
4) java -Djava.library.path=. Test (실행)
2. C++ String 값 받아오기
가. Java
com.jni.test,JniTest.java
package com.jni.test;
public class JniTest {
static{ System.loadLibrary("JniStringTest"); } public JniTest(){ String msg= getMessage(); System.out.println(msg); } public native static String getMessage();
public static void main(String[] args){ new JniTest(); } }
|
나. C++
Test.cpp
#include <jni.h> #include <stdlib.h> #include "com_jni_test_JniTest.h" /* Class: com_jni_test_JniTest * Method: getMessage * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_jni_test_JniTest_getMessage(JNIEnv * env, jclass jobj){ jstring msg; msg = env->NewStringUTF("hhhh"); return msg; } |
다. 순서
1) javah -jni com.jni.test.JniTest
2) g++ -c -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux com_jni_test_JniTest.cpp
3) g++ -shared -o libJniStringTest.so com_jni_test_JniTest.o
4) java -Djava.library.path=. com.jni.test.JniTest (실행)
3. C++ String 값 넘기기
가. Java
com.jni.test,JniReturnTest.java
package com.jni.test;
public class JniReturnTest {
static{ System.loadLibrary("jniReturnTest"); } public static native String getMassageDiff(String msg); public static void main(String[] args){ String msg = JniReturnTest.getMassageDiff("donghun"); System.out.println(msg); } }
|
나. C++
com_jni_test_jniReturnTest.cpp
#include <jni.h> #include <stdlib.h> #include "com_jni_test_JniReturnTest.h" JNIEXPORT jstring JNICALL Java_com_jni_test_JniReturnTest_getMassageDiff (JNIEnv * env, jclass jobj,jstring jstr1) { char temp[256] = {0}; jstring msg; char* param=(char*)env->GetStringUTFChars(jstr1,0); sprintf(temp,"%s hun",param); msg = env->NewStringUTF(temp); free(param); return msg; }
|
다. 순서
1) javah -jni com.jni.test.JniTest
2) g++ -c -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux com_jni_test_JniTest.cpp
3) g++ -shared -o libJniReturnTest.so com_jni_test_jniReturnTest.cpp.o
4) java -Djava.library.path=. com.jni.test.JniReturnTest (실행)