JNI JAR загрузки с зависимостями

Я пытаюсь загрузить следующий класс Java в моей программе C ++ с использованием JNI:

package helloWorld;

import org.apache.log4j.Logger;

public class HelloWorld{

private static final Logger logger = Logger.getLogger(HelloWorld.class);

public static void main(String[] args){
System.out.println("Hello, World");
}
public static int square(int input){
int output = input * input;
return output;
}
public static int power(int input, int exponent){
int output,i;
output=1;
for(i=0;i<exponent;i++){
output *= input;
}
return output;
}
}

Это зависит от log4j-1.2.16.jar

Вот мой код C ++:

#include <stdio.h>
#include <cstdlib>
#include "../Header/jni.h"
JNIEnv* create_vm(JavaVM **jvm)
{
char * classPath = (char *) "-Djava.class.path=HelloWorld-0.0.1-SNAPSHOT.jar";
JNIEnv* env;
JavaVMInitArgs args;
JavaVMOption options[2];
args.version = JNI_VERSION_1_6;
args.nOptions = 1;
options[0].optionString = classPath;
options[1].optionString = "-verbose";
args.options = options;
args.ignoreUnrecognized = 0;
int rv;
rv = JNI_CreateJavaVM(jvm, (void**)&env, &args);
if (rv < 0 || !env)
printf("Unable to Launch JVM %d\n",rv);
else
printf("Launched JVM! :)\n");
return env;
}

void invoke_class(JNIEnv* env)
{
jclass hello_world_class;
jmethodID main_method;
jmethodID square_method;
jmethodID power_method;
jint number=20;
jint exponent=3;

hello_world_class = env->FindClass("helloWorld/HelloWorld");

if(hello_world_class == NULL){
if(env->ExceptionOccurred()){
env->ExceptionDescribe();
}
printf("Class not found.");
}
else{
main_method = env->GetStaticMethodID(hello_world_class, "main", "([Ljava/lang/String;)V");
square_method = env->GetStaticMethodID(hello_world_class, "square", "(I)I");
power_method = env->GetStaticMethodID(hello_world_class, "power", "(II)I");
env->CallStaticVoidMethod(hello_world_class, main_method, NULL);
printf("%d squared is %d\n", number,
env->CallStaticIntMethod(hello_world_class, square_method, number));
printf("%d raised to the %d power is %d\n", number, exponent,
env->CallStaticIntMethod(hello_world_class, power_method, number, exponent));
}
}

int main(int argc, char **argv)
{
JavaVM *jvm;
JNIEnv *env;
env = create_vm(&jvm);
if(env == NULL)
return 1;
invoke_class(env);
system("PAUSE");
return 0;
}

Я поместил HelloWorld.jar в корневую папку моего приложения C ++. Когда он пытается загрузить hello_world_class, выдается следующее исключение:

java.lang.NoClassDefFoundError: org/apache/log4j/Logger
at helloWorld.HelloWorld.<clinit>(HelloWorld.java:7)

JNI не находит зависимость log4j, потому что она не находится внутри HelloWorld.jar. Я пытался поместить его в папку lib и в ту же папку, что и HelloWorld.jar, но это не сработало. Где мне нужно разместить log4j.jar, чтобы JNI мог его восстановить и загрузить?

Большое спасибо, я новичок в JNI, поэтому, пожалуйста, будьте ясны в своих ответах. Я был на этой ошибке весь день Т.Т.

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]