카테고리 없음

Java Jni Test

인천총각 2011. 4. 22. 15:17

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 (실행)