gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:36:47 26 4
gpt4 key购买 nike

我发现 jni 有一个关于 C 调用 Java 代码的问题。环境 WIN10 JDK1.8目前我需要C++代码来调用Java代码。起初我写了一个成功的demo。代码如下:

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++工程中,上面的DEMO C++调用Java函数成功,findclass函数恢复正常。

因为我自己的Java中要引入一个第三方JAR包org.eclipse.paho.client.mqttv3-1.2.0.jar,所以在上面的例子的基础上,修改了DEMO中的Java代码,但是当我想引用JAR包功能,然后在Eclipse中运行成功,当我将.class文件复制到C++项目中。 C++代码中的JNI_CreateJavaVM返回成功,但是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;

此外,确保将所有 JAR 文件夹放在 java.class.path 中,其中包含您的代码所需的类。

关于c++ - Jni C++ findclass 函数返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56079200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com