2011-10-02 99 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") 
相关问题