Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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
C++ Jni-C++;findclass函数返回null_C++_Java Native Interface - Fatal编程技术网

C++ Jni-C++;findclass函数返回null

C++ Jni-C++;findclass函数返回null,c++,java-native-interface,C++,Java Native Interface,我发现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

我发现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++项目中,上面的C++调用java函数是成功的,FIDClass函数返回正常。 因为我必须在我自己的java中引入一个第三方jar包og.clio.PaHo.clit.MQTTV3-1.2.0.jar,基于上面的例子,我在演示中修改了java代码,但是当我想引用jar包函数时,然后在Eclipse中成功运行,当我将.class文件复制到C++项目时。C++代码中的JNIKCurATEJavaM成功返回,但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=newmqttasyncclient(代理、clientId、newmemorypersistence())在代码之后,将出现问题

请查看此处

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文件夹,其中包含代码所需的类。

请查看此处

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;

另外,请确保打开所有的
JAR
s文件夹,其中包含代码所需的类。

您必须将第三方JAR添加到类路径中(在
-Djava.class.path=
行中)很可能是类路径问题——类< Eclipse .PAHO .clili.MQTTV3.MQTTAsCycClient < /C> >在类路径中没有找到,所以类<代码> SAMPLE 2失败。虽然代码在C中比C++习惯写得多,但它似乎使用了JNI接口的C++版本,并且您将其描述为“C++”,所以我修改了标签来替换[C]和[C++ ]。谢谢,我复制了第三方JAR包到C++项目,并在Djava之后添加了这个jar。class = PATH =,但是这个问题仍然存在。还有其他可能吗?您的
-Djava.class.path=
选项行现在是什么样子?您需要将jar和当前文件夹都指定为类路径。您必须将第三方jar添加到类路径中(在
-Djava.class.path=
行中),很可能是类路径问题——类
org.eclipse.paho.client.mqttv3.MqttAsyncClient
在类路径中找不到,所以,C++ C++ C++语言编写的C++类代码,虽然它的代码在C语言中比C++习惯写得多,但是它确实使用C++版本的JNI接口,你把它描述成“C++”,所以我修改了标签来代替[C+],[C++]。谢谢,我把第三方JAR包复制到C++项目中,并在-Djava.class.path=之后添加了这个jar,但这个问题仍然存在。还有其他可能吗?您的
-Djava.class.path=
选项行现在是什么样子?您需要将jar和当前文件夹都指定为类路径。