2012-03-30 41 views
5

Tôi đang viết một chương trình đơn giản để gọi một hàm Java từ chương trình C.gọi hàm java từ c bằng cách sử dụng jni

Tiếp theo là mã của tôi:

#include <jni.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <pthread.h> 
#include <time.h> 
#include <stdlib.h> 

JNIEnv* create_vm() { 
    JavaVM* jvm; 
    JNIEnv *env; 
    JavaVMInitArgs vm_args; 

    JavaVMOption options[1]; 

    options[0].optionString - "-Djava.class.path=/home/chanders/workspace/Samples/src/ThreadPriorityTest"; 
    vm_args.version = JNI_VERSION_1_6; 
    vm_args.nOptions = 1; 
    vm_args.options = &options; 
    vm_args.ignoreUnrecognized = JNI_FALSE; 

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

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

    helloWorldClass = (*env)->FindClass(env, "InvocationHelloWorld"); 
    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() { 
    JNIEnv* env = create_vm(); 
    invoke_class(env); 
} 

Tôi đang biên soạn chương trình trên sử dụng: gcc -o gọi -I $ JAVA_HOME/include/-I $ JAVA_HOME/include/linux -L $ JAVA_HOME/jre/lib/amd64/máy chủ/ThreadPriorityTest.c

và tôi nhận được lỗi sau:

/tmp/ccllsK5O.o: In function `create_vm': ThreadPriorityTest.c:(.text+0x35): undefined reference to `JNI_CreateJavaVM' collect2: ld returned 1 exit status 

tôi không thực sự chắc chắn những gì đang gây ra vấn đề này

UPDATE 1

Bao gồm các -ljvm trong dòng lệnh và sau đó có một undefined reference to FUNCTION_NAME Tôi đang chạy nó trên RHEL 6.2

+0

Hãy xem http://stackoverflow.com/questions/7680415/calling-java-code-from-c-in-an-android-application – aProgrammer

+0

đã thử, nhưng nó đã bắt đầu cho tôi một loạt các tham chiếu chưa được xác định. –

+0

hoặc http://www.codeproject.com/Questions/263687/Linker-error-undefined-reference-to-_imp__JNI_Crea – aProgrammer

Trả lời

5

Bạn đã có những đường vào thư viện Java (các -L tùy chọn), nhưng không phải là thư viện. Bạn cũng cần bao gồm -ljvm trên đường liên kết.

+0

Tôi đã thử, nhưng không nhận được một loạt tham chiếu không xác định. Tôi đã cập nhật câu hỏi của mình. –

+0

Bạn có nghĩa là nghĩa đen FUNCTION_NAME (Tôi không có đầu mối nếu có) hoặc bạn có nghĩa là nói chung rất nhiều chức năng không xác định khác? –

+0

i có nghĩa là nhiều chức năng không xác định khác –

Các vấn đề liên quan