Jni C ++ функция findclass вернуть ноль - PullRequest
1 голос
/ 10 мая 2019

Я обнаружил проблему с jni о том, что C вызывает код Java.Среда WIN10 JDK1.8 В настоящее время мне нужен код C ++ для вызова кода Java.Сначала я написал, что демотат был успешным.Код выглядит следующим образом:

public class Sample2 {
    public String name;  
    public static String sayHello(String name) {  
        return "Hello, " + name + "!";  
    }    
    public String sayHello() {  
        return "Hello, " + name + "!";  
    }  
}

Часть кода C ++ выглядит следующим образом:

int main(){
    printf("hello world");
    JavaVMOption options[3];
    JNIEnv* env;
    JavaVM* jvm;
    JavaVMInitArgs vm_args;

    long status;
    jclass cls;
    jmethodID mid;
    jfieldID fid;
    jobject obj;
    char opt1[] = "-Djava.compiler=NONE";
    char opt2[] = "-Djava.class.path=.";
    char opt3[] = "-verbose:NONE";
    options[0].optionString = opt1; options[0].extraInfo = NULL;
    options[1].optionString = opt2; options[1].extraInfo = NULL;
    options[2].optionString = opt3; options[2].extraInfo = NULL;
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_8;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = 0;

    // 启动虚拟机
    status = JNI_CreateJavaVM(&jvm, (void**)& env, &vm_args);

    if (status != JNI_ERR){
        // 先获得class对象
        cls = env->FindClass("Sample2");
    }
}

Я использовал Eclipse для компиляции кода Java в файл .class, скопируйте .classфайла в моем C ++ проекте, вышеупомянутая функция Java вызова DEMO C ++ успешно выполнена, и функция findclass возвращается в нормальное состояние.

Поскольку мне нужно представить сторонний пакет JAR org.eclipse.paho.client.mqttv3-1.2.0.jar в моем собственном Java, основанном на приведенном выше примере, я изменил код Java в DEMO, но когда я хочу сослаться на функцию пакета JAR, а затем успешно выполнить в Eclipse, когда я копирую файл .classв проект C ++.JNI_CreateJavaVM в коде C ++ возвращается успешно, но FINDCLASS всегда возвращает ноль, я не знаю почему.Я не изменил код других частей.Некоторый код Java:

import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; 
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class Sample2 {
    public String name;  
    static MqttAsyncClient mqttClient = null;

    static String username = "xxx";  
    static String password = "xxx"; 
    static String broker = "xxx"; 

    public static void main(String[] args) throws InterruptedException {
        System.out.print("hello");
    }

    public static void start() {
        String clientId = "mqttserver" + String.valueOf(System.currentTimeMillis());

        try {
            mqttClient = new MqttAsyncClient(broker, clientId, new MemoryPersistence());

        } catch (Exception me) {
            me.printStackTrace();
        }
    }

При добавлении функции запуска mqttClient = new MqttAsyncClient(broker, clientId, new MemoryPersistence()); После кода возникнут проблемы

1 Ответ

0 голосов
/ 24 мая 2019

Взгляните сюда

char opt1[] = "-Djava.compiler=NONE";
char opt2[] = "-Djava.class.path=.";
char opt3[] = "-verbose:NONE";
options[0].optionString = opt1; options[0].extraInfo = NULL;
options[1].optionString = opt2; options[1].extraInfo = NULL;
options[2].optionString = opt3; options[2].extraInfo = NULL;
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;

Вы передаете три опции (массив опций с тремя заданными опциями), но затем вы говорите что-то вроде этого

vm_args.nOptions = 1;

, что означает, что вы передаете только один вариант. Это означает, что ваши варианты

char opt2[] = "-Djava.class.path=.";
char opt3[] = "-verbose:NONE";

даже не читаются. Вы должны изменить свой код на

 vm_args.nOptions = 3;

Кроме того, убедитесь, что в java.class.path включены все JAR s, папки, где указаны классы, необходимые для вашего кода.

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