JNI——C呼び出しJAVA
20085 ワード
手順:
1.仮想マシンの作成
2.classを取得
3.オブジェクトのインスタンス化:構築メソッド(メソッド名")、構築パラメータ、呼び出しメソッドを取得
4.呼び出し方法:獲得方法、構築方法、呼び出し方法に分けられる
操作方法:
1.コンパイル:javac Hello.java
2. javap -p -s Hello.class:Signatureの表示
3. gcc -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/-I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux/-o caller caller.c -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm
4.実行:LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server ./caller
例:
(1)call_static_method
(2)call_non_static_method
1.仮想マシンの作成
2.classを取得
3.オブジェクトのインスタンス化:構築メソッド(メソッド名")、構築パラメータ、呼び出しメソッドを取得
4.呼び出し方法:獲得方法、構築方法、呼び出し方法に分けられる
操作方法:
1.コンパイル:javac Hello.java
2. javap -p -s Hello.class:Signatureの表示
3. gcc -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/-I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux/-o caller caller.c -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm
4.実行:LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server ./caller
例:
(1)call_static_method
1 #include
2 #include
3
4
5 JNIEnv* create_vm(JavaVM** jvm, JNIEnv** env)
6 {
7 JavaVMInitArgs args;
8 JavaVMOption options[1];
9 args.version = JNI_VERSION_1_6;
10 args.nOptions = 1;
11 options[0].optionString = "-Djava.class.path=./";
12 args.options = options;
13 args.ignoreUnrecognized = JNI_FALSE;
14 return JNI_CreateJavaVM(jvm, (void **)env, &args);
15 }
16
17 int main(int argc, char **argv)
18 {
19 JavaVM* jvm;
20 JNIEnv* env;
21
22 jclass cls;
23 int ret = 0;
24
25 jmethodID mid;
26
27 /* 1. create java virtual machine */
28 if(create_vm(&jvm, &env))
29 {
30 printf("can not create jvm
");
31 return -1;
32 }
33
34 /* 2. get class */
35 cls = (*env)->FindClass(env, "Hello");
36 if(cls == NULL)
37 {
38 printf("can not find hello class
");
39 ret = -1;
40 goto destory;
41 }
42
43 /* 3. create object */
44
45 /* 4. call method
46 * 4.1 get method
47 * 4.2 create parameter
48 * 4.3 call method
49 */
50
51 mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
52 if(mid == NULL)
53 {
54 ret = -1;
55 printf("can not get method
");
56 goto destory;
57 }
58
59 (*env)->CallStaticVoidMethod(env, cls, mid, NULL);
60
61 destory:
62 (*jvm)->DestroyJavaVM(jvm);
63
64 return ret;
65 }
(2)call_non_static_method
1 #include
2 #include
3
4
5 JNIEnv* create_vm(JavaVM** jvm, JNIEnv** env)
6 {
7 JavaVMInitArgs args;
8 JavaVMOption options[1];
9 args.version = JNI_VERSION_1_6;
10 args.nOptions = 1;
11 options[0].optionString = "-Djava.class.path=./";
12 args.options = options;
13 args.ignoreUnrecognized = JNI_FALSE;
14 return JNI_CreateJavaVM(jvm, (void **)env, &args);
15 }
16
17 int main(int argc, char **argv)
18 {
19 JavaVM* jvm;
20 JNIEnv* env;
21
22 jclass cls;
23 int ret = 0;
24
25 jmethodID mid;
26 jmethodID cid;
27
28 jobject jobj;
29 jstring jstr;
30
31 int r;
32
33 /* 1. create java virtual machine */
34 if(create_vm(&jvm, &env))
35 {
36 printf("can not create jvm
");
37 return -1;
38 }
39
40 /* 2. get class */
41 cls = (*env)->FindClass(env, "Hello");
42 if(cls == NULL)
43 {
44 printf("can not find hello class
");
45 ret = -1;
46 goto destory;
47 }
48
49 /* 3. create object
50 *
51 */
52
53 cid = (*env)->GetMethodID(env, cls, " ", "()V");
54 if(cid == NULL)
55 {
56 printf("can not get construct method
");
57 ret = -1;
58 goto destory;
59 }
60
61 jobj = (*env)->NewObject(env, cls, cid);
62 if(jobj == NULL)
63 {
64 printf("can not create object
");
65 ret = -1;
66 goto destory;
67 }
68
69 /* 4. call method
70 * 4.1 get method
71 * 4.2 create parameter
72 * 4.3 call method
73 */
74
75 mid = (*env)->GetMethodID(env, cls, "sayhello_to", "(Ljava/lang/String;)I");
76 if(mid == NULL)
77 {
78 ret = -1;
79 printf("can not get method
");
80 goto destory;
81 }
82
83 jstr = (*env)->NewStringUTF(env, "[email protected]");
84
85 r = (*env)->CallIntMethod(env, jobj, mid, jstr);
86 printf("ret = %d
", r);
87
88 destory:
89 (*jvm)->DestroyJavaVM(jvm);
90
91 return ret;
92 }