gpt4 book ai didi

java - 无法使用JNI从C++中的jar访问某些类

转载 作者:行者123 更新时间:2023-11-30 05:07:46 29 4
gpt4 key购买 nike

我需要用 C++ 在 jar 上写一个包装器。我做了一个 POC,在那里我能够找到所有类,但在某些 jar 中我得到了 nullptr。

jclass keyCloakTestClass = env-
>FindClass("com/test/main/KeycloakAdapterProperties");
if(keyCloakTestClass == nullptr)
{
cerr << "ERROR: class not found !";
}

我正在获取 jclass 对象作为 nullptr。

KeycloakAdapterProperties类的代码片段如下。

  package com.test.main;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLClassLoader;
import java.util.Properties;

public final class KeycloakAdapterProperties
{
private KeycloakAdapterProperties()
{
throw new InstantiationError("no instance creation allowed");
}
}

是否与 JAR 的创建有关?

请分享您关于为什么我得到 nullptr 的意见?

最佳答案

==========问题详情============================ =====

问题:无法从 keycloakadapterapi jar 访问某些类。

根本原因: 该类无法从其他 jar 中找到它的依赖项。

解决方案:每当您为特定类调用 JNI 的 findClass() 方法时,请确保在 C++ 中加载 JVM 时提及所有必需的 jar。

例如

//==================== prepare loading of Java VM ============================
JavaVMInitArgs vm_args; // Initialization arguments
JavaVMOption* options = new JavaVMOption[3]; // JVM invocation options
options[0].optionString = "-Djava.class.path=D:\\UserManagment\\KeycloakAdapterWrapper\\ocskeycloakadapterapi-3.1.0.6.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\log4j-api-2.7.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\log4j-core-2.7.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\log4j-iostreams-2.7.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\bcpkix-jdk15on-1.52.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\bcprov-jdk15on-1.52.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\commons-codec-1.9.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\commons-lang3-3.6.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\commons-logging-1.2.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\httpclient-4.5.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\httpcore-4.4.1.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jackson-annotations-2.5.0.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jackson-core-2.5.4.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jackson-databind-2.5.4.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jboss-logging-3.3.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jsoup-1.10.3.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-adapter-core-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-adapter-spi-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloakAdapterWrapper.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-common-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-core-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-installed-adapter-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\spcommon-0.0.0.2-SNAPSHOT.jar"; // where to find java .class
vm_args.version = JNI_VERSION_1_8; // minimum Java version
vm_args.nOptions = 1; // number of options
vm_args.options = options;
vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail

//================= load and initialize Java VM and JNI interface ===============
jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !!

注意:我在加载 Java VM 时提到了一个 jar(其中编写了我的目标类)。

关于java - 无法使用JNI从C++中的jar访问某些类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47132297/

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