코코아를 좋아하는 프로그래머입니다 ;)
Double 형 데이터를 주고 받는 예제를 작성해 보자. double 형 수치값을 전달하면 해당 수치의 제곱근값을 반환하는 함수를 작성한다.
#include <jni.h> #include <cmath> jdouble square ( JNIEnv *env, jobject thiz, jdouble value ) { return std::sqrt(value); } JNIEXPORT jint JNICALL JNI_OnLoad ( JavaVM *vm, void *reserved ) { JNIEnv *env; if(vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6)) { return -1; } //c++11 //Brace-Initialization JNINativeMethod nm { const_cast<char *>("square"), const_cast<char *>("(D)D"), reinterpret_cast<void*>(square) }; jclass cls = env->FindClass("Client"); env->RegisterNatives(cls, &nm, 1); return JNI_VERSION_1_6; }
이번 예제에서는 JNINativeMethod 구조체 초기화를 C++11 에서 새롭게 소개된 초기화 방법을 사용했다. 자세한 내용은 C++11의 문법책을 참고하길 바란다.
이제 코드를 컴파일해서 네이티브 라이브러리를 만들어보자.
$ g++ "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/" -std=c++11 -c PassAndReturnDouble.cpp $ g++ -dynamiclib -o libpardouble.jnilib passandreturndouble.o
c++11 기능을 사용하려면 -std 옵션에 c++11 을 주어야 한다.
이제 네이티브 라이브러리를 사용하는 자바 파일을 작성한다.
$ vi Client.java
public class Client { private native double square(double value); public static void main(String[] args) { Client client = new Client(); System.out.println("The square of 2 is " + client.square(2)); System.out.println("The square of 9 is " + client.square(9)); } static { System.loadLibrary("pardouble"); } }
자바 코드를 컴파일하고 실행해 보자.
$ javac Client.java $ java Client The square of 2 is 1.4142135623730951 The square of 9 is 3.0