Closed xianjimli closed 4 years ago
是个不错的建议, minijvm是非标准的jni接口,不过较为类似,如果有生成工具,稍加修改,就可以适配.
好的,周末我研究一下。
AWTK-JAVA基本功能可以用了:https://github.com/zlgopen/awtk-java
真快,我看看怎么移植过来.
我对JAVA不熟,你先帮我看看有没有原则性的问题。这两天我先把minijvm AWTK jni的代码产生器写出来,后面你来集成到minijvm吧。
基本代码已经生成了:https://github.com/zlgopen/awtk-minijvm
编译和集成还不清楚怎么搞,你有空帮忙弄一下吗?
minijvm非常棒,minijvm 加上 AWTK在嵌入式linux系统上大有可为。
我抽时间先看一下
我发现一个问题,JNI动态库加载的顺序晚了一点(JAVA SE是没问题的),导致JNI函数没有注册。不知有没有办法把JNI动态库先加载进来?
java.lang.NoSuchMethodException: APP_MOBILE
at awtk/TAppType.APP_MOBILE(TAppType.java:-1)
at awtk/TAppType.<clinit>(TAppType.java:17)
java.lang.NoSuchMethodException: EVT_POINTER_DOWN
at awtk/TEventType.EVT_POINTER_DOWN(TEventType.java:-1)
at awtk/TEventType.<clinit>(TEventType.java:17)
loadLibrary
loadLibrary done
[INFO]main thread start
main
java.lang.NullPointerException:
at DemoButton.init(DemoButton.java:22)
at DemoButton.main(DemoButton.java:46)
我还没有编译出awtk库,在centos上没有编译成功, 刚把ubuntu装好,晚上编译一下
你说的这个问题,参见 desktop\glfw_gui\java\src\main\java\org\mini\glfw\Glfw.java 需要在最先调用的java源文件中,加载库文件so
public class Glfw {
static {
Glfw.loadLib();
}
static boolean loaded;
public static void loadLib() {
if (!loaded) {
System.setProperty("java.library.path", "./");
System.loadLibrary("gui");
}
loaded = true;
}
...
}
ubuntu编译 awtk 看起来很顺利,明天应该可以看一下绑定代码了
在枚举里貌似不能loadLibary,我加了demos,你有空试试。
./mini_jvm -cp ../lib/minijvm_rt.jar:../libex/janino.jar:../libex/awtk_gui.jar:../libex/awtk_demos.jar DemoButton
加个QQ联系啊,30600449
确实有个问题,因为优化性能,把类初始化太早,导致还没有加载本地库就调用了jni函数,minijvm源码已修复提交。
绑定里面出现函数声明和使用参数类型不对的情况,生成函数有问题
java.lang.NoSuchMethodException: widget_on
at awtk/TWidget.widget_on(TWidget.java:-1)
at awtk/TWidget.on(TWidget.java:606)
at DemoButton.createUI(DemoButton.java:27)
at DemoButton.main(DemoButton.java:39)
我加你了,你确认一下。
绑定里面出现函数声明和使用参数类型不对的情况,生成函数有问题
java.lang.NoSuchMethodException: widget_on at awtk/TWidget.widget_on(TWidget.java:-1) at awtk/TWidget.on(TWidget.java:606) at DemoButton.createUI(DemoButton.java:27) at DemoButton.main(DemoButton.java:39)
你更新一下代码。我这里可以运行了。还有两个小问题:
1.能否通过java.library.path设置动态库的路径。
2.有没有C调用JAVA代码的示例。
基本功能可以了,剩下一个问题,如何获取JAVA函数的返回值呢?
54 env->push_ref(runtime->stack, info->obj);
55 env->push_long(runtime->stack, (s64)data);
56
57 if (env->execute_method(minfo, runtime)) {
58 env->print_exception(runtime);
59 } else {
60 /*TODO: get the return value*/
61 }
调用java方法后,返回值在栈顶,不用处理,或者从栈顶弹出,再压回去
调用java方法后,返回值在栈顶,不用处理,或者从栈顶弹出,再压回去
我需要把它取出来放到一个变量里,应该怎么弄呢?
QQ请求没收到,你再发一次,或者你的QQ号是多少
54 env->push_ref(runtime->stack, info->obj);
55 env->push_long(runtime->stack, (s64)data);
56
57 if (env->execute_method(minfo, runtime)) {
58 env->print_exception(runtime);
59 } else {
60 s32 value= env->pop_int(runtime->stack); //或者其他类型的变量, Instanse *obj=env->pop_ref(runtime->stack);
61 }
好的。谢谢。基本功能都可以了。你可以更新代码玩一下。
非常赞
miniJVM很有意思,如果和AWTK结合起来一定更好玩。
如果有兴趣搞,我抽时间写个AWTK-JAVA绑定的代码生成器。