JNI Java 来自 C 多个 Java 依赖

JNI Java From C Multiple Java Dependencies

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

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

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

特别注意下面的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;
}