FindClass возвращает значение NULL, если .class отсутствует в пакете по умолчанию - PullRequest
0 голосов
/ 27 июня 2018

Я только что посмотрел на любые другие вопросы, но, похоже, ни у кого нет моей проблемы. У меня есть класс Java HelloWorldHandler.java (в пакете org.eclipse.gemoc.testapplilauncher.handlers в проекте org.eclipse.gemoc.testapplilauncher), который запускает другое приложение Java. Затем у меня есть файл c launcherC.c (в том же проекте, но в другом каталоге), который должен вызывать метод execute в java-файле через JNI. Теперь все мои предыдущие приложения JNI работали, а это нет. Единственное отличие состоит в том, что HelloWorldHandler.java отсутствует в пакете по умолчанию (поэтому .class не является прямым в / bin) и существует несколько импортов пакетов (возможно, что-то меняется с вызовом FindClass (?)). Я запускаю файл c с
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

и

export LD_LIBRARY_PATH=${LD_LIBRARY_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);

    }
}

launcherC.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;
}

Все предложения действительно приветствуются, я схожу с ума. Спасибо:)

1 Ответ

0 голосов
/ 27 июня 2018

Первая проблема, вы неправильно установили classpath

Вместо

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");

Но я полагаю, это не все ваши проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...