Burt.K

코코아를 좋아하는 프로그래머입니다 ;)

JNI 문자열 – 3/3

자바 문자열을 받아서 해당 문자열에 다른 문자열을 붙여서 반환하는 예제를 작성해 보자.

$ vi Greeting.cpp
#include <jni.h>
#include <string>

jstring greeting
(
    JNIEnv      *env,
    jobject     thiz,
    jstring     name
)
{
    //convert java-string to c-string
    const char *cName = env->GetStringUTFChars(name, nullptr);
    
    std::string msg = "Hello, " + std::string(cName);
    
    env->ReleaseStringUTFChars(name, cName);
    
    //convert c-string to java-string
    jstring ret = env->NewStringUTF(msg.c_str());
    return ret;
}

JNIEXPORT jint JNICALL JNI_OnLoad
(
    JavaVM      *vm,
    void        *reserved
)
{
    JNIEnv      *env;
    if(vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6)) {
        return -1;
    }
    
    JNINativeMethod nm {
        const_cast<char*>("greeting"),
        const_cast<char*>("(Ljava/lang/String;)Ljava/lang/String;"),
        reinterpret_cast<void*>(greeting)
    };
    
    jclass cls = env->FindClass("Client");
    env->RegisterNatives(cls, &nm, 1);
    return JNI_VERSION_1_6;
}

위 코드는 이름을 담은 자바 문자열 앞에 Hello 문자열을 붙이는 예제다. 문자열 연산을 쉽게 하기 위해서 STL string 클래스를 사용했다. 코드를 컴파일하고 라이브러리로 만든다.

$ g++ "-I/System/Library/Java/JavaVirtualMachines/Current/" -std=c++11 -c Greeting.cpp
$ g++ -dynamiclib -o libgreeting.jnilib greeting.o

이제 라이브러리를 사용하는 자바 코드를 작성한다.

$ vi Client.java
public class Client {
    
    public native String greeting(String name);
    
    public static void main(String[] args) {
        
        
        Client client = new Client();
        

        System.out.println(client.greeting("Robin"));
        System.out.println(client.greeting("Batman"));
        System.out.println(client.greeting("토르"));
        
    }
    
    static {
        System.loadLibrary("greeting");
    }
}

자바 코드를 컴파일하고 실행한다.

$ javac Client.java
$ java Client
Hello, Robin
Hello, Batman
Hello, 토르

 

← JNI 문자열 – 2/3
std::vector 를 C언어 배열로 변경하기 →