2011-10-02 37 views
1

env->FindClass("java.lang.Math");失敗。爲什麼?env-> FindClass(「java.lang.Math」);

gcc -I/System/Library/Frameworks/JavaVM.framework/Headers test.cpp -framework JavaVM -o test && ./test 

http://developer.apple.com/library/mac/#samplecode/simpleJavaLauncher/Listings/utils_h.html#//apple_ref/doc/uid/DTS10000688-utils_h-DontLinkElementID_7 http://developer.apple.com/library/mac/#technotes/tn2147/_index.html

#include <jni.h> 
#include <stdlib.h> 

int main() { 
    printf("START.\n"); 

    JavaVM* jvm = NULL; 
    JNIEnv *env; 

    JavaVMInitArgs vm_args; 
    JNI_GetDefaultJavaVMInitArgs(&vm_args); 
    vm_args.version = JNI_VERSION_1_6; 
    vm_args.nOptions = 0; 

    int ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 
    if(ret < 0) { 
     printf("Unable to Launch JVM\n");  
    return 1; 
    } 

    jclass mathClass = env->FindClass("java.lang.Math"); 
    if (mathClass == NULL) { 
     printf("Unable to find java.lang.Math\n"); 
    return 1; 
    } 

    jmethodID cosMethod = env->GetStaticMethodID(mathClass, "cos", "(D)D"); 
    if (cosMethod == NULL) { 
     printf("Unable to find java.lang.Math.cos()\n"); 
    return 1; 
    } 

    printf("call\n"); 
    jdouble jIn = 0.1; 
    jdouble jOut = env->CallStaticIntMethod(mathClass, cosMethod, jIn); 
    printf("jOut: %f", jOut); 

    printf("DestroyJavaVM.\n"); 
    jvm->DestroyJavaVM(); 
    printf("END.\n"); 

    return 0; 
} 
+1

有沒有使用在C語言中的'cos'任何理由?我認爲這只是一個在C中啓動JVM的簡單例子? –

回答

6

你應該叫:

jclass mathClass = env->FindClass("java/lang/Math"); 

來自documentation

名稱:完全限定的類名稱(即,包名稱,由「/」分隔,後跟類名稱)。如果名稱以「[」(數組簽名字符)開頭,則返回一個數組類。

+0

太好了,謝謝!一個相關的問題,我得到jOut = -106424383.000000,當它應該是0.9950。我是否需要將jdouble變成雙倍? – user974735

+3

當您調用返回double的方法時,'CallStaticIntMethod'聽起來有點奇怪。 – Mat

2

嘗試:

env->FindClass("java/lang/Math")