无法使用 JNI 从 jar 中的 jar 访问某些类C++
Unable to access certain classes from jar in C++ using JNI
我需要在C++罐子上写一个包装器。我做了一个 POC,在那里我能够找到所有的类,但在某些罐子里我得到了 nullptr。
jclass keyCloakTestClass = env-
>FindClass("com/test/main/KeycloakAdapterProperties");
if(keyCloakTestClass == nullptr)
{
cerr << "ERROR: class not found !";
}
我正在将 jclass 对象作为 nullptr。
KeycloakAdapter属性类的代码片段如下所示。
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 的意见?
===========问题
详情===
=================================问题:无法从密钥伪装适配器 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(我的目标类是在其中编写的)。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 通过指向指针数组的指针访问子类的属性
- 无法使用 JNI 从 jar 中的 jar 访问某些类C++