步骤:
1. 创建虚拟机;
2. 获得class;
3. 实例化对象:获得构造方法(方法名为“7e51f00a783d7eb8f68358439dee7daf”),构造参数,调用方法。
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
#include <stdio.h>#include <jni.h>jnienv* create_vm(javavm** jvm, jnienv** env) { javavminitargs args; javavmoption options[1]; args.version = jni_version_1_6; args.noptions = 1; options[0].optionstring = "-djava.class.path=./"; args.options = options; args.ignoreunrecognized = jni_false; return jni_createjavavm(jvm, (void **)env, &args); } int main(int argc, char **argv){ javavm* jvm; jnienv* env; jclass cls; int ret = 0; jmethodid mid; /* 1. create java virtual machine */ if(create_vm(&jvm, &env)) { printf("can not create jvm\n"); return -1; } /* 2. get class */ cls = (*env)->findclass(env, "hello"); if(cls == null) { printf("can not find hello class\n"); ret = -1; goto destory; } /* 3. create object */ /* 4. call method * 4.1 get method * 4.2 create parameter * 4.3 call method */ mid = (*env)->getstaticmethodid(env, cls, "main", "([ljava/lang/string;)v"); if(mid == null) { ret = -1; printf("can not get method\n"); goto destory; } (*env)->callstaticvoidmethod(env, cls, mid, null);destory: (*jvm)->destroyjavavm(jvm); return ret;}
(2)call_non_static_method
#include <stdio.h>#include <jni.h> jnienv* create_vm(javavm** jvm, jnienv** env) { javavminitargs args; javavmoption options[1]; args.version = jni_version_1_6; args.noptions = 1; options[0].optionstring = "-djava.class.path=./"; args.options = options; args.ignoreunrecognized = jni_false; return jni_createjavavm(jvm, (void **)env, &args); } int main(int argc, char **argv){javavm* jvm;jnienv* env;jclass cls;int ret = 0;jmethodid mid;jmethodid cid;jobject jobj;jstring jstr;int r; /* 1. create java virtual machine */if(create_vm(&jvm, &env)){ printf("can not create jvm\n"); return -1;}/* 2. get class */cls = (*env)->findclass(env, "hello");if(cls == null){ printf("can not find hello class\n"); ret = -1; goto destory;}/* 3. create object * */cid = (*env)->getmethodid(env, cls, "<init>", "()v");if(cid == null){ printf("can not get construct method\n"); ret = -1; goto destory;}jobj = (*env)->newobject(env, cls, cid);if(jobj == null){ printf("can not create object\n"); ret = -1; goto destory;}/* 4. call method * 4.1 get method* 4.2 create parameter* 4.3 call method*/mid = (*env)->getmethodid(env, cls, "sayhello_to", "(ljava/lang/string;)i");if(mid == null){ ret = -1; printf("can not get method\n"); goto destory;}jstr = (*env)->newstringutf(env, "287787472@qq.com");r = (*env)->callintmethod(env, jobj, mid, jstr);printf("ret = %d\n", r);destory:(*jvm)->destroyjavavm(jvm);return ret;}
,大量的免费java入门教程,欢迎在线学习!
以上就是c如何调用java的详细内容。