Hello, JNI World!
Posted on 4月 10th, 2012 by cx20
JNI
JNA(Java Native Interface)は、Java と他の言語のインターフェイス仕様である。
Java から C言語のライブラリの呼び出し、また、C言語から Java のライブラリの呼び出し等が可能である。
ここでは、C言語から Java のライブラリの呼び出しのサンプルを記載する。
ソースコード(呼び出す側(C++))
#include <jni.h>
int main( int argc, char* argv[] )
{
JNIEnv* env;
JavaVM* jvm;
// Java VM オプション設定
JavaVMOption options[1];
options[0].optionString = "-Xmx128m";
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = 1;
// Java VM 作成
JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
// Class 検索
jclass clazz = env->FindClass("Hello");
// Method ID 取得
jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
// Class メソッド呼び出し
env->CallStaticVoidMethod(clazz, mid, NULL);
// Java VM 破棄
jvm->DestroyJavaVM();
return 0;
} |
#include <jni.h>
int main( int argc, char* argv[] )
{
JNIEnv* env;
JavaVM* jvm;
// Java VM オプション設定
JavaVMOption options[1];
options[0].optionString = "-Xmx128m";
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = 1;
// Java VM 作成
JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
// Class 検索
jclass clazz = env->FindClass("Hello");
// Method ID 取得
jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
// Class メソッド呼び出し
env->CallStaticVoidMethod(clazz, mid, NULL);
// Java VM 破棄
jvm->DestroyJavaVM();
return 0;
}
ソースコード(呼び出される側(Java))
public class Hello {
public static void main( String[] args ) {
System.out.println( "Hello, JNI World!" );
}
} |
public class Hello {
public static void main( String[] args ) {
System.out.println( "Hello, JNI World!" );
}
}
コンパイル&実行方法
$ javac Hello.java
$ c++ -o jnihello jnihello.cpp ¥
-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ ¥
-framework JavaVM ¥
-m64
$ ./jnihello |
$ javac Hello.java
$ c++ -o jnihello jnihello.cpp ¥
-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ ¥
-framework JavaVM ¥
-m64
$ ./jnihello
実行結果
Tags: JNI
Categories: C++, Java, JNI, library