import java.awt.*; import java.awt.event.*; public class Input extends Panel implements ActionListener{ TextField tf; public Input() { tf = new TextField(30); tf.addActionListener(this); setLayout(new BorderLayout()); add("Center", tf); } public void actionPerformed(ActionEvent e) { if (e.getSource() == tf) { String str = tf.getText(); System.out.println("Java> "+str); int length = send(str); System.out.println("length = "+length); tf.setText(""); } } static { System.loadLibrary("input"); } public native int send(String data); public static void main(String args[]) { Frame f = new Frame(); Input i = new Input(); f.add("Center", i); f.pack(); f.show(); } } |
#include <jni.h> #include "Input.h" #include <stdio.h> JNIEXPORT jint JNICALL Java_Input_send(JNIEnv *env, jobject obj, jstring data) { /*dataのクラス(java.lang.String)を取得*/ jclass cls = (*env)->GetObjectClass(env, data); /*String.length() の MethodID を取得*/ jmethodID mid = (*env)->GetMethodID(env, cls, "length", "()I"); int length; const char *str = (*env)->GetStringUTFChars(env, data, 0); printf("C > %s : ", str); fflush(stdout); /* nativeからjava.lang.String.length()をコールする */ length = (*env)->CallIntMethod(env, data, mid); (*env)->ReleaseStringUTFChars(env, data, str); return length; } |
Java で入力用ウィンドウを開き、入力した文字列を C に渡して、C から java.lang.String.length() を呼んで文字列の長さを求めて、求められた長さを Java に返す、という面倒なことをしています。
java.lang.String.length() は、引数無し、返値は int なので、Type Signature は "()I" になります。
% java Input
として実行すると、次のようなウィンドウが開き、文字を入力すると、その長さを調べて、標準出力に表示する。
Java> YOSHIDA C > YOSHIDA : length = 7 Java> NORISHIGE C > NORISHIGE : length = 9 Java> hogehoge C > hogehoge : length = 8 Java> Java Native Method Interface : JNI C > Java Native Method Interface : JNI : length = 34