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
 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 }