当.class不在默认包中时,FindClass 返回 null



我刚刚看过其他人的问题,但似乎没有人有和我一样的问题。我有一个Java类HelloWorldHandler.java(在org.eclipse.gemoc.testapplilauncher项目的org.eclipse.gemoc.testapplilauncher.handlers包中(启动另一个Java应用程序。然后我有一个 c 文件launcherC.c(在同一个项目中但不同的目录中(,它应该通过 JNI 调用 java 文件中的执行方法。现在,我以前的所有 JNI 应用程序都有效,而这个应用程序则不起作用。唯一的区别是 HelloWorldHandler.java 不在默认包中(因此.class不是直接的/bin 中(,并且有多个包导入(可能随着 FindClass 调用 (?(而发生了一些变化(。 我用gcc -fPIC -I"/usr/lib/jvm/java-8-oracle/include" -I"/usr/lib/jvm/java-8-oracle/include/linux" -L/usr/lib/jvm/java-8-oracle/lib/amd64/jli/ -L/usr/lib/va-8-oracle/jre/lib/amd64/server/ -o launcherC launcherC.c -ljli -ljvm启动
c 文件

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

而且没有问题。但是当我执行它时,它不会做任何事情,没有任何期望和错误。我检查了一下,FindClass 返回 NULL。

你好世界处理程序.java

package org.eclipse.gemoc.testapplilauncher.handlers;

public class HelloWorldHandler {
@Execute
public static void execute() {
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile ff = root.getFile(new Path("d/Test.launch"));

ILaunchConfiguration res = manager.getLaunchConfiguration(ff);
DebugUITools.launch(res, ILaunchManager.DEBUG_MODE);
}
}

发射器C.c

#include <jni.h>
#include <string.h>
int main()
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
options[0].optionString = "-Djava.class.path=/home/ezambon/Desktop/modeling/org/eclipse/gemoc/testAppliLauncher/bin/org/eclipse/gemoc/testapplilauncher/handlers";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status != JNI_ERR)
{
cls = (*env)->FindClass(env, "HelloWorldHandler");
if(cls != 0) {
//printf("asdfghn");
mid = (*env)->GetStaticMethodID(env, cls, "execute", "()V");
if(mid !=0) {
(*env)->CallStaticVoidMethod(env, cls, mid);
}
}
//printf("qwerty");
(*jvm)->DestroyJavaVM(jvm);
return 0;
}
else
return -1;
}

所有的建议都非常受欢迎,我快疯了。谢谢:)

第一个问题,你设置了类路径错误

而不是

options[0].optionString = "-Djava.class.path=/home/ezambon/Desktop/modeling/org/eclipse/gemoc/testAppliLauncher/bin/org/eclipse/gemoc/testapplilauncher/handlers";

你应该有

options[0].optionString = "-Djava.class.path=/home/ezambon/Desktop/modeling/org/eclipse/gemoc/testAppliLauncher";

你应该使用完整的类名

cls = (*env)->FindClass(env, "org.eclipse.gemoc.testapplilauncher.handlers.HelloWorldHandler");

但我想这不是你所有的问题。

最新更新