Hal*_*ian 5 c java java-native-interface noclassdeffounderror
我试图让JNI沾沾自喜,因为我在C中有一个需要访问单个Java库函数的应用程序(没有C等价库).我编写了一个非常简单的测试程序,用于从C加载Java VM并调用静态函数并获取返回值.
不幸的是,我无法让课程正确加载.虽然它可能归结为它,但我认为我的ClassPath是正确的:当我java在同一目录中使用具有相同ClassPath 的命令时,该类加载并执行完美.
环境:
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]
Run Code Online (Sandbox Code Playgroud)
这是我运行C程序时得到的结果(./myClassABC):
[Loaded ...]
[Loaded my.ClassABC from file:/home/me/project/]
Exception in thread "main" java.lang.NoClassDefFoundError: my.ClassABC
Failed to get class
Run Code Online (Sandbox Code Playgroud)
这是我的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.]
}
Run Code Online (Sandbox Code Playgroud)
我的java代码,仅用于#$%@ s和giggles(编译为/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;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
Brian
jit*_*ter 10
只需更换它
cls = (*env)->FindClass(env,"my.ClassABC");
Run Code Online (Sandbox Code Playgroud)
同
cls = (*env)->FindClass(env,"my/ClassABC");
Run Code Online (Sandbox Code Playgroud)
你应该没事
否则尝试添加
...
JavaVMOption options[3];
...
options[2].optionString = "-verbose:jni";
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6095 次 |
| 最近记录: |