首页 >Java >Java入门 > 正文

c如何调用java

原创2019-11-11 13:33:440625
phpStudy Linux 面板(小皮面板)

步骤:

1. 创建虚拟机;

2. 获得class;

3. 实例化对象:获得构造方法(方法名为“<init>”),构造参数,调用方法。

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

php中文网,大量的免费Java入门教程,欢迎在线学习!

以上就是c如何调用java的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:c 调用 java
  • 本文原创发布php中文网,转载请注明出处,感谢您的尊重!
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • 专题推荐

    作者信息
    推荐视频教程
  • JAVA 初级入门视频教程JAVA 初级入门视频教程
  • Java参考文档Java参考文档
  • 极客学院Java8新特性视频教程极客学院Java8新特性视频教程
  • 最新Java完整视频教程最新Java完整视频教程
  • 视频教程分类