2012-06-04 86 views
2

我有類在Java中稱爲XMLDOMDocument這個類有一些方法CreateXMLAddNodeRemoveNode等我把從C代碼這種方法與Java本地接口的幫助,但這樣做,我傳遞給我的JAVA類的C代碼對象然後調用env->GetObjectClass(myclass)我從該對象中獲取我的類並調用JAVA類的方法。創建C代碼JAVA類

我想知道我可以做同樣的事情(調用JAVA方法),而無需將我的類傳遞給C代碼。我可以在C代碼中創建JAVA類,然後調用它的方法。

編輯

如果我在C代碼有JavaVM的我可以創建Java類在C代碼的新實例與Java虛擬機的幫助。

編輯

我想我找到一些有用的東西Creating the Java Virtual Machine,但我想知道什麼樣的價值,必須stetted #define USER_CLASSPATH?如果一定要包名com.fido.android.framework.service

public class Prog { 
    public static void main(String[] args) { 
      System.out.println("Hello World " + args[0]); 
    } 
} 

#include <jni.h> 

#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */ 
#define USER_CLASSPATH "." /* where Prog.class is */ 

main() { 
    JNIEnv *env; 
    JavaVM *jvm; 
    jint res; 
    jclass cls; 
    jmethodID mid; 
    jstring jstr; 
    jclass stringClass; 
    jobjectArray args; 

#ifdef JNI_VERSION_1_2 
    JavaVMInitArgs vm_args; 
    JavaVMOption options[1]; 
    options[0].optionString = 
     "-Djava.class.path=" USER_CLASSPATH; 
    vm_args.version = 0x00010002; 
    vm_args.options = options; 
    vm_args.nOptions = 1; 
    vm_args.ignoreUnrecognized = JNI_TRUE; 
    /* Create the Java VM */ 
    res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 
#else 
    JDK1_1InitArgs vm_args; 
    char classpath[1024]; 
    vm_args.version = 0x00010001; 
    JNI_GetDefaultJavaVMInitArgs(&vm_args); 
    /* Append USER_CLASSPATH to the default system class path */ 
    sprintf(classpath, "%s%c%s", 
      vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH); 
    vm_args.classpath = classpath; 
    /* Create the Java VM */ 
    res = JNI_CreateJavaVM(&jvm, &env, &vm_args); 
#endif /* JNI_VERSION_1_2 */ 

    if (res < 0) { 
     fprintf(stderr, "Can't create Java VM\n"); 
     exit(1); 
    } 
    cls = (*env)->FindClass(env, "Prog"); 
    if (cls == NULL) { 
     goto destroy; 
    } 

    mid = (*env)->GetStaticMethodID(env, cls, "main", 
            "([Ljava/lang/String;)V"); 
    if (mid == NULL) { 
     goto destroy; 
    } 
    jstr = (*env)->NewStringUTF(env, " from C!"); 
    if (jstr == NULL) { 
     goto destroy; 
    } 
    stringClass = (*env)->FindClass(env, "java/lang/String"); 
    args = (*env)->NewObjectArray(env, 1, stringClass, jstr); 
    if (args == NULL) { 
     goto destroy; 
    } 
    (*env)->CallStaticVoidMethod(env, cls, mid, args); 

destroy: 
    if ((*env)->ExceptionOccurred(env)) { 
     (*env)->ExceptionDescribe(env); 
    } 
    (*jvm)->DestroyJavaVM(jvm); 
} 

我也想知道傳球類對象之間從Java到C和創建Java類權使用C

回答

1

的CLASSPATH差異應該定義你會以同樣的方式在啓動Java虛擬機時傳遞它。所以如果你想創建一個在com.fido.android.framework.service包內的類,你可以將生成的C可執行文件放在某個目錄中,並且編譯後的Java類放在com/fido/android/framework/service中子目錄。這樣,你不需要改變CLASSPATH定義

包的名字應該在findClass的調用進行傳遞:

cls = (*env)->FindClass(env, "com/fido/android/framework/service/Prog"); 
+0

@mavropovato如果我的C文件不能在同一個目錄中的java類,我該如何指定路徑?例如,我的C項目位於C:/projects/newproject/mycfile.c,而java類位於C:/java_projects/scr/com/Android/fido/ ..... –

+0

您可以將CLASSPATH指向所在的目錄你的課堂文件已定位,但我不會推薦它。請記住,如果您在C中定義了某些內容,則需要重新編譯才能更改它。對我來說最好的解決方案是將你的所有類文件打包成與你的可執行文件相關的jar文件,並將你的classpath指向那裏 – mavroprovato