2016-01-04 3 views
0

Я использую JNI для вызова Java из кода C. Мой проект Java зависит от многих классов и внешних банок. Я смущен, как упаковать свой проект Java, чтобы его можно было вызвать внутри C.JNI Java From C Несколько зависимостей Java

Насколько я понимаю, JNI использует один файл класса, но если этот класс зависит от многих других классов, как это работает?

ответ

2

Когда вы используете 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; 
} 
+0

Благодарим Вас за отзыв. Это полностью ответило на мой вопрос. Я бы проголосовал за вас, но у меня недостаточно высокая репутация. – btald1331

+0

Добро пожаловать. Вы должны иметь возможность отмечать ответ как принятый (галочка слева от ответа). Это то, что вы должны делать с лучшим ответом, отвечая на ваш вопрос. – Codo

Смежные вопросы