Когда вы используете Java из C (а не наоборот), вы сначала запускаете JVM, а затем запускаете некоторый Java-код. Когда вы запускаете JVM, вы можете указать путь к классам, который обычно включает несколько файлов 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;
}
Благодарим Вас за отзыв. Это полностью ответило на мой вопрос. Я бы проголосовал за вас, но у меня недостаточно высокая репутация. – btald1331
Добро пожаловать. Вы должны иметь возможность отмечать ответ как принятый (галочка слева от ответа). Это то, что вы должны делать с лучшим ответом, отвечая на ваш вопрос. – Codo