千家信息网

C语言项目中怎么调用java类

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,C语言项目中怎么调用java类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先需要编写java类public class Sample
千家信息网最后更新 2025年01月31日C语言项目中怎么调用java类

C语言项目中怎么调用java类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

首先需要编写java类

public class Sample {                public static void test2() {                                System.out.println("java打印的helloword");        }}

这是非常简单的一个java类,里面就只有一个java方法。等下我们就要通过C来调用这个方法。jvm只认识class,首先得编译它,java Sample.java。在当前目录得到一个Sample.class的文件。这个文件等下会被我们的C程序加载。

然后编写C代码。

#include //引入jni的头文件,下面加载类和调用类的方法都是通过jni里面的函数实现的#include int main() {         JavaVMOption options[1];         JNIEnv *env;         JavaVM *jvm;         JavaVMInitArgs vm_args;         long status;         jclass cls;         jmethodID mid;         jint square;         jboolean not;         options[0].optionString = "-Djava.class.path=."; //设置classpath        memset(&vm_args, 0, sizeof(vm_args));         vm_args.version = JNI_VERSION_1_2;         vm_args.nOptions = 1;         vm_args.options = options;         status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);         if (status != JNI_ERR)         {                 //cls = (*env)->FindClass(env, "java/lang/Object");                 cls=(*env)->FindClass(env,"Sample");//通过FindClass函数找到这个类,这里需要添加类的描述符合,如果是Object就应该是java/lang/Object                printf("find the class\n");                if(cls !=0)                 {                        //mid = (*env)->GetStaticMethodID(env, cls, "main", "(I)I");                         mid=(*env)->GetStaticMethodID(env,cls,"main","([Ljava/lang/String;)V");//通过函数找到方法,这里面应该是方法的描述符。                        printf("find the method\n");                        if(mid !=0)                         {                                printf("exec method\n");                                square = (*env)->CallStaticIntMethod(env, cls, mid, NULL); //执行方法                                printf("Result of intMethod: %d\n", square);                         }                         mid = (*env)->GetStaticMethodID(env, cls, "booleanMethod", "(Z)Z");                         if(mid !=0)                         { not = (*env)->CallStaticBooleanMethod(env, cls, mid, 1);                                 printf("Result of booleanMethod: %d\n", not);                         }                 }                 else{                        printf("not found\n");                }                (*jvm)->DestroyJavaVM(jvm);                 return 0;         }         else                 return -1; }

,如果直接gcc 是会报错的,因为jni头文件不在系统的头文件里面。而且动态链接库也不在系统默认的库里面。所以编写一个Makefile:

compile:        gcc calljvm.c -I  $JAVA_HOME/include/  -I $JAVA_HOME/include/linux/  -L$JAVA_HOME/jre/lib/amd64/server/ -ljvm  -o calljvm

执行make,顺利应该编译通过,但是执行是会报错的。因为libjvm.so不在/usr/lib 里面。所以得把jvm的库加到系统库路径里面

export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/:$JAVA_HOME/jre/lib/amd64/servr

系统默认会在/usr/lib里面寻找动态链接库,如果有LD_LIBRARY_PATH之后会优先在LD_LIBRARY_PATH指定路径找,如果找不到再去/usr/lib。

看完上述内容,你们掌握C语言项目中怎么调用java类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0