gpt4 book ai didi

java - JNI Java 来自 C 多个 Java 依赖项

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:13 40 4
gpt4 key购买 nike

我正在使用 JNI 从 C 代码调用 Java。我的 Java 项目依赖于许多类和外部 jar。我很困惑如何打包我的 java 项目以便它可以在 C 中调用。

据我了解,JNI 使用单个类文件,但如果该类依赖于许多其他类,这将如何工作?

最佳答案

当您从 C 使用 Java(而不是相反)时,您首先启动 JVM,然后运行一些 Java 代码。当您启动 JVM 时,您可以指定一个类路径,该路径通常包含多个 jar 文件,每个 jar 文件包含多个 Java 类。它绝不限于单个类文件。

特别注意下面的optionString:

#include <jni.h>
#include <stdio.h>

int main() {
JavaVM *vm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=./lib/jarfile1.jar;./lib/jarfile2.jar";
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = 1;
jstring jstr;
jobjectArray args;
jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
if (res < 0) {
printf("Can't create Java VM\n");
exit(1);
}
jclass cls = env->FindClass("YourMainClass");
if (cls == 0) {
printf("YourMainClass class not found\n");
exit(1);
}
jmethodID mid =
env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
if (mid == 0) {
printf("main() method not found\n");
exit(1);
}
jstring argString = env->NewStringUTF(""); //empty arg list
jobjectArray args =
env->NewObjectArray(1, env->FindClass("java/lang/String"), jstr);
if (args == 0) {
printf("Out of memory\n");
exit(1);
}
env->CallStaticVoidMethod(cls, mid, args);
return 0;
}

关于java - JNI Java 来自 C 多个 Java 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599285/

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