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.h>//引入jni的頭文件,下面加載類和調用類的方法都是通過jni里面的函數實現的
#include <string.h>
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類的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。