[英]Jni C++ findclass function return null
我发现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 ++项目中,上面的DEMO C ++调用Java函数成功,并且findclass函数恢复正常。
由于我必须在自己的Java中引入第三方JAR包org.eclipse.paho.client.mqttv3-1.2.0.jar,因此,基于上述示例,我在DEMO中修改了Java代码,但是当我想引用JAR包函数,然后将.class文件复制到C ++项目中,然后在Eclipse中成功运行。 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
中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.