2013-02-19 141 views
2

我需要從c程序調用java方法。我已經嘗試了下面的代碼通過Java本地接口調用java方法,但在編譯時遇到問題。我對C新手,並有在Java的經驗。所以,我無法想象自己在創建JVM時發生了什麼。JNI從c程序調用java方法

以下是代碼。

CTest.c 
#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=D:\\Ashish_Review\\JNI\\src"; 
    args.options = options; 
    args.ignoreUnrecognized = JNI_FALSE; 

    JNI_CreateJavaVM(&jvm, (void **)&env, &args); 
    return env; 
} 

void invoke_class(JNIEnv* env) { 
    jclass helloWorldClass; 
    jmethodID mainMethod; 
    jobjectArray applicationArgs; 
    jstring applicationArg0; 

    helloWorldClass = (*env)->FindClass(env, "HelloWorld"); 

    mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V"); 

    applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL); 
    applicationArg0 = (*env)->NewStringUTF(env, "From-C-program"); 
    (*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0); 

    (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs); 
} 


int main(int argc, char **argv) { 
    JNIEnv* env = create_vm(); 
    invoke_class(env); 
} 


C:\Users\Desktop\tcc>tcc C:\TurboC++\Disk\TurboC3\BIN\CTest.c -I "C:\Program Files\Java\jdk1.6.0_16\include" -I "C:\Program Files\Java\jdk1.6.0_16\include\win32" -shared -o CTest.dll 
tcc: undefined symbol '[email protected]' 

請幫我一把。

+0

這是一個鏈接器錯誤,而不是編譯器錯誤。它看起來也許你應該編譯爲C++,而不是C. – 2014-05-28 06:12:59

回答

0

錯誤消息是關於鏈接階段,而不是編譯 - 你已經包含了頭文件,但是爲了創建可執行文件,你還必須指定.a(庫文件)。

您必須鏈接到JVM的庫(將一些對libjvm.a的引用添加到tcc的命令行)。

如果您沒有用於TurboC++的預編譯jvm.lib文件,還有另一個選項 - 與jvm.dll文件鏈接並手動從JVM中導出所有方法。這使用LoadLibrary/GetProcAddress函數。

對於短樣品(對不起,找不到出口的全部源代碼),看看這個:

/* load library */ 
HMODULE dll = LoadLibraryA("jvm.dll"); 

/* declare a function pointer and initialize it with the "pointer" to dll's code */ 
JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr = GetProcAddress(dll, "JNI_CreateJavaVM"); 

以後使用JNI_CreateJavaVM_ptr代替JNI_CreateJavaVM。你也必須聲明JNI_CreateJavaVM_func類型 - 你可能只是從「jni.h」複製簽名