top / index / prev / next / target / source

2006-11-08 diary: Java: シンプルな C言語からJava言語を呼び出すJNIサンプル

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: シンプルな C言語からJava言語を呼び出すJNIサンプル

シンプルな C言語からJava言語を呼び出すJNIサンプルを作成しました。

Java: シンプルな C言語からJava言語を呼び出すJNIサンプル

シンプルな C言語からJava言語を呼び出すJNIサンプル・トイプログラムを作成しました。

C言語を久しぶりに触ったのですが、もはや かなり忘れてしまっていることが判明しました。 C言語ソースコード

/*
 * シンプルなJNIサンプル。
 */
#include "stdafx.h"
#include "jni.h"

int main(int argc, char* argv[])
{
    JNIEnv *jnienv;
    JavaVM *javavm;
    JavaVMInitArgs vm_args;

    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=.";
    vm_args.version = JNI_VERSION_1_2;
    vm_args.options = options;
    vm_args.nOptions = 1;
    vm_args.ignoreUnrecognized = true;

    printf("JavaVMを作成.\n");
    int result = JNI_CreateJavaVM(&javavm, (void **)&jnienv, &vm_args);

    if (result != 0) {
        printf("JavaVMの作成に失敗しました(%d).\n", result);
        return 1;
    }

    printf("クラス検索.\n");
    jclass cls = jnienv->FindClass("MyClass");
    if (cls == 0) {
        printf("クラス検索に失敗しました.\n");
        return 1;
    }

    printf("メソッド取得.\n");
    jmethodID mid = jnienv->GetStaticMethodID(cls, "process", "()Ljava/lang/String;");
    if (mid == 0) {
        printf("メソッド取得に失敗しました.\n");
        return 1;
    }

    printf("メソッド呼出.\n");
    jobject objResult = jnienv->CallStaticObjectMethod(cls, mid);

    jthrowable throwResult = jnienv->ExceptionOccurred();
    if (throwResult != NULL) {
        printf("例外が発生しました.\n");
        jnienv->ExceptionDescribe();
        jnienv->ExceptionClear();
        return 1;
    }

    if (objResult == NULL) {
        printf("メソッドの戻り値がnullでした.\n");
    } else {
        jstring strResult = (jstring) objResult;
        printf("[%s]\n", jnienv->GetStringUTFChars(strResult, NULL));
    }
    
    printf("JavaVMを破棄.\n");
    result = javavm->DestroyJavaVM();
    if (result != 0) {
        printf("JavaVMの破棄に失敗しました(%d).\n", result);
        return 1;
    }

    return 0;
}

呼び出される Javaのサンプルは下記のようなものになります。 MyClass.java

public class MyClass {
    public static String process() {
        return "Hello world.";
    }
}

関連する日記

blanco Framework: blancoMessageのPHPソースコード生成機能

blancoMessageのPHPソースコード生成機能ですが、最低限の単体試験をパスする状態にまで進みました。

自動生成されるソースコード


この日記について