Спасибо за то, что взглянули на вопрос. Я пытаюсь вызвать метод Java, который находится в файлах класса с помощью интерфейса JNI. В свою очередь названный файл класса должен выполнять другой .jar файл, который находится в том же direcotry? У меня было трудное время, достигая этого, и я неудачен в выполнении .jar файла. Я подразумеваю, что не могу получить результаты класса fuile доступный в .jar файле.
Кто-либо может объяснить, возможно ли сделать тот путь, или я должен искать другую опцию?
Код похож на это:
class JNIInterface
{
private:
JavaVMInitArgs vm_args;
JavaVM *jvm;
JNIEnv *env;
long result;
jmethodID mid;
jfieldID fid;
jobject jobj;
jclass cls;
int asize;
char JVMOptionString[20];
char className[20];
char methodName[20];
JavaVMOption options[1];
public:
JNIInterface(char* JVMOptionString)
{
// JavaVMOption options[1];
options[0].optionString = JVMOptionString;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.version = JNI_VERSION_1_6;
vm_args.ignoreUnrecognized = JNI_FALSE;
}
void setClassName(char* className)
{
result = JNI_CreateJavaVM( &jvm,(void **)&env, &vm_args);
if(result == JNI_ERR )
{
printf("Error invoking the JVM\n");
//return 0;
}
cls = env->FindClass("F2C");
if( cls == NULL )
{
printf("can't find class F2C\n");
//return 0;
}
env->ExceptionClear();
}
void setMethodName(char* methodName)
{
cout<<"---------- Function Name is "<<methodName<<endl;
//---------- Integer Value with Parameter ----------------
mid=env->GetStaticMethodID(cls, methodName, "([Ljava/lang/String;)V");
if (mid != NULL)
{
env->CallStaticVoidMethod(cls,mid,"70");
}
int main()
{
JNIInterface JNIInterfaceObj("-Djava.class.path=C:\\MyPOC;C:\\MyPOC\\herong.jar");
JNIInterfaceObj.setClassName("F2C");
JNIInterfaceObj.setMethodName("main");
return 0;
}
.
//The java file which is calling jar files is - F2C.java
/**
* F2C.java
* Copyright (c) 2006 by Dr. Herong Yang, http://www.herongyang.com/
*/
import herong.TempratureConvertorBean;
public class F2C {
public void test(String[] arg) {
try {
double f = 0.0;
System.out.println("Inside test func:");
TempratureConvertorBean b = new TempratureConvertorBean();
if (arg.length>0) f = Double.parseDouble(arg[0]);
b.setFahrenheit(f);
double c = b.getCelsius();
System.out.println("Fahrenheit = "+f);
System.out.println("Celsius = "+c);
System.out.println(b.getInfo());
}
}
public static void main(String[] arg) {
F2C f2c = new F2C();
f2c.test(arg);
}
}
этот F2C.java использует herong.jar файл
Предложите, если у Вас есть какая-либо идея. Спасибо, Asg
Ваш вопрос не совсем ясен, но я дам общий ответ...
В Java есть только два способа заставить Java искать в .jar-файле (и в конце концов они действительно сводятся к одному), а это указать .jar-файл в classpath, или создать classloader, который будет искать в этом jar-файле и добавлять его в список classloaders, которые будет использовать Java.
И, конечно же, весь classpath - это набор классных загрузчиков, которые Java инстанцирует и использует еще до того, как ваша программа запустится.
Итак, программе JNI нужно сделать вызовы Java (которые я сейчас не ищу), чтобы настроить новый классовый загрузчик и заставить Java начать использовать его, если программе JNI понадобится Java, чтобы начать поиск в дополнительных .jar-файлах.