2009-11-23 22 views
5

C言語で単一のJavaライブラリ関数(C同等のライブラリはありません)にアクセスする必要があるアプリケーションがあるため、私はJNIに夢中にしようとしています。私は、CからJava VMをロードし、静的関数を呼び出して戻り値を取得する非常に簡単なテストプログラムを作成しました。JNI呼び出しAPI - NoClassDefFoundError(C/Java)

残念ながら、クラスを適切に読み込むことができません。それはおそらくそれに沸騰するだろうが、私は私のクラスパスは正しいと思う:同じディレクトリ内の同じClassPathでjavaコマンドを使用すると、クラスが読み込まれ、完全に実行されます。

環境:
のUbuntu 8.04サーバー
のJava JRE & SDK 1.6
gccの

私の現在の作業ディレクトリは常に/home/me/projectです。ここで

は私がjavaコマンド(java -Djava.class.path=/home/me/project/ -verbose my.ClassABC)実行したときに、私が得るものである:ここでは

[Loaded ...] (many loads) 
[Loaded my.ClassABC from file:/home/me/project/] 
Hello test 
[Loaded java.lang.Shutdown from shared objects file] 
[Loaded java.lang.Shutdown$Lock from shared objects file] 

を、私は私のCプログラム(./myClassABC)を実行したときに、私が得るものである:ここでは

[Loaded ...] 
[Loaded my.ClassABC from file:/home/me/project/] 
Exception in thread "main" java.lang.NoClassDefFoundError: my.ClassABC 
Failed to get class 

です私のgccコマンドライン:

gcc -o myClassABC myClassABC.c -I/usr/lib/jvm/java-6-sun-1.6.0.16/include/ -I/usr/lib/jvm/java-6-sun-1.6.0.16/include/linux -L/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server/ -ljvm

私のCコード(myClassABC.c):

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

    JavaVMInitArgs vm_args; 
    JavaVMOption options[2]; 
    options[0].optionString = 
     "-Djava.class.path=."; // or "-Djava.class.path=/home/me/project/"; 
    options[1].optionString = 
     "-verbose"; 
    vm_args.version = JNI_VERSION_1_6; 
    vm_args.options = options; 
    vm_args.nOptions = 2; 
    vm_args.ignoreUnrecognized = JNI_FALSE; 
    /* Create the Java VM */ 
    res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 

    if (res < 0) { 
     fprintf(stderr, "Can't create Java VM\n"); 
     exit(1); 
    } 
    if ((*env)->ExceptionOccurred(env)) { 
     (*env)->ExceptionDescribe(env); 
    } 

    cls = (*env)->FindClass(env,"my.ClassABC"); 
    if (cls == NULL) { 
     if ((*env)->ExceptionOccurred(env)) { 
      (*env)->ExceptionDescribe(env); 
     } 
     printf("Failed to get class\n"); 
     exit(1); 
    } 

    [call methods, etc.] 
} 

そして、ちょうど#$%@ sおよびくすくす笑いのための私のJavaコード、(/home/me/project/my/ClassABC.classにコンパイルされる):

package my; 

class ClassABC { 
    public static void main(String[] args) { 
     System.out.println(ClassABC.getPassword("test")); 
     return; 
    } 

    static String getPassword(String filename) 
    { 
     return "Hello "+filename; 
    } 
} 

おかげで、
ブライアン

答えて

10

これをちょうど置き換えます。

cls = (*env)->FindClass(env,"my.ClassABC"); 

cls = (*env)->FindClass(env,"my/ClassABC"); 

です。

エルス

... 
JavaVMOption options[3]; 
... 
options[2].optionString = "-verbose:jni"; 
... 
+0

を追加してみてください男ああ、ありがとうございました!仕様やものを振り返ってみると、私はそれを見直しました。 – HalfBrian

関連する問題