Test.java
import java.awt.Frame;
public class Test {
public static void main(String[] args) {
try {
System.out.println("test main");
Frame t = new Frame();
System.out.println("test main2");
} catch (Exception e) {
System.out.println("Catch");
}
finally {
System.out.println("Finally");
}
}
}
test.cc
JNIEnv *_VMEnvironment;
JavaVM *_VM;
jclass _JavaClass;
void init()
{
const int tCount = 1;
JavaVMInitArgs tArgs;
JavaVMOption tOptions[tCount];
tArgs.version = JNI_VERSION_1_6;
tArgs.nOptions = tCount;
std::string tPath = "-Djava.library.path=/usr/lib";
tOptions[0].optionString = const_cast<char*>(tPath.c_str());
tArgs.options = tOptions;
tArgs.ignoreUnrecognized = JNI_FALSE;
JNI_CreateJavaVM(&_VM, (void**)&_VMEnvironment, &tArgs);
}
void start()
{
jmethodID tMainMethod;
_JavaClass = _VMEnvironment->FindClass("Test");
tMainMethod = _VMEnvironment->GetStaticMethodID(
_JavaClass, "main", "([Ljava/lang/String;)V");
_VMEnvironment->CallStaticVoidMethod(_JavaClass, tMainMethod, nullptr);
std::cout << "Done" << std::endl;
}
int main()
{
init();
start();
return 0;
}
Если я ссылаюсь против libverify, libjava, libjvm
Я получаю следующий вывод:
test main
test main2
Finally
Done
Однако, если я также ссылку против libjawt, libmawt, libawt
Я получаю следующий вывод:
test main
Finally
Done
Я очень озадачен, почему второй println (по-видимому) не выполняется. Я попытался создать другие типы объектов вместо фрейма и не увидел, что проблема возникает. Точно так же я пробовал разные типы объектов AWT и всегда видел один и тот же результат. Для справки я использую 64-битные центы с Java 1.7.0_51.
Задача ещё не решена.