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;
}
}
おかげで、
ブライアン
を追加してみてください男ああ、ありがとうございました!仕様やものを振り返ってみると、私はそれを見直しました。 – HalfBrian