JNI C FindClass函数返回null

Jni C++ findclass function return null

本文关键字:返回 null 函数 FindClass JNI      更新时间:2023-10-16

我发现JNI的问题是c调用Java代码。环境WIN10 JDK1.8目前,我需要C 代码来调用Java代码。起初,我写了一个demothat成功了。代码显示如下:

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 项目中,以上演示C 调用Java java函数成功了,FindClass函数返回正常。

因为我必须在我自己的java中介绍第三方jar package org.eclipse.client.mqttv3-1.2.0.jar。我想引用JAR软件包功能,然后将.class文件复制到C 项目时在Eclipse中成功运行。C 代码中的Jni_createjavm成功返回,但是FindClass总是返回null,我不知道为什么。我没有更改其他零件代码。一些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());在代码后,会出现问题

在此处查看

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,文件夹,您的代码要求的类别为。