Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当.class不在默认包中时,FindClass返回null_Java_C_Eclipse_Ubuntu_Java Native Interface - Fatal编程技术网

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

Java 当.class不在默认包中时,FindClass返回null,java,c,eclipse,ubuntu,java-native-interface,Java,C,Eclipse,Ubuntu,Java Native Interface,我刚看过其他人的问题,但似乎没有人有我的问题。我有一个Java类HelloWorldHandler.Java(在org.eclipse.gemoc.testapplilauncher.handlers中org.eclipse.gemoc.testapplilauncherproject中的package)启动另一个Java应用程序。然后我有一个c文件Launcher c.c(在同一个项目中,但在不同的目录中),它应该通过JNI调用java文件中的execute方法。现在,我以前的所有JNI应用程

我刚看过其他人的问题,但似乎没有人有我的问题。我有一个Java类HelloWorldHandler.Java(在
org.eclipse.gemoc.testapplilauncher.handlers中
org.eclipse.gemoc.testapplilauncher
project中的
package)启动另一个Java应用程序。然后我有一个c文件Launcher c.c(在同一个项目中,但在不同的目录中),它应该通过JNI调用java文件中的execute方法。现在,我以前的所有JNI应用程序都工作了,但这一个没有。唯一的区别是HelloWorldHandler.java不在默认包中(因此.class在/bin中不是directy),并且存在多个包导入(可能会随着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/usr/lib/va-8-oracle/jre/lib/amd64/server/-o launcherclauncherclaunchercc.c-ljli-ljvm

export-LD\u-LIBRARY\u-PATH=${LD\u-LIBRARY\u-PATH}:/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

没有问题。但当我执行它时,它什么也不做,没有任何预期和错误。我检查了,FindClass返回NULL

HelloWorldHandler.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("asdfgh\n");
        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;
}
#包括
#包括
int main()
{
JavaVMOption选项[1];
JNIEnv*env;
JavaVM*jvm;
JavaVMInitArgs vm_args;
长期状态;
jclass cls;
jmethodidemid;
选项[0]。选项字符串=“-Djava.class.path=/home/ezambon/Desktop/modeling/org/eclipse/gemoc/testAppliLauncher/bin/org/eclipse/gemoc/testAppliLauncher/handlers”;
memset(&vm_参数,0,sizeof(vm_参数));
vm_args.version=JNI_version_1_2;
vm_args.nOptions=1;
vm_args.options=选项;
status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
如果(状态!=JNI_ERR)
{
cls=(*env)->FindClass(env,“HelloWorldHandler”);
如果(cls!=0){
//printf(“asdfgh\n”);
mid=(*env)->GetStaticMethodID(env,cls,“execute”,以及“()V”);
如果(中间!=0){
(*env)->CallStaticVoidMethod(env、cls、mid);
}
}
//printf(“qwerty”);
(*jvm)->破坏JavaVM(jvm);
返回0;
}
其他的
返回-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");

但我想这并不是你的全部问题。

处理程序中的代码只会在正确设置的Eclipse中的Eclipse插件中运行。它不会在一个空的JVM中运行,就像你在这里展示的那样。所以,要使JNI成为可能,我应该怎么做?你不能像这样运行Eclipse插件代码。最接近的方法是创建一个“headless”EclipseRCP并运行可执行文件。cls仍然为空。唯一的问题是路径,因为其余的代码与我编写的其他程序相同,并且都可以运行。在限定类名
org/eclipse/…