digitalgust / miniJVM

Develop iOS Android app in java, Cross platform java virtual machine , the minimal jvm .
MIT License
328 stars 91 forks source link

miniJVM很有意思,如果和AWTK结合起来一定更好玩。 #2

Closed xianjimli closed 4 years ago

xianjimli commented 5 years ago

miniJVM很有意思,如果和AWTK结合起来一定更好玩。

如果有兴趣搞,我抽时间写个AWTK-JAVA绑定的代码生成器。

digitalgust commented 5 years ago

是个不错的建议, minijvm是非标准的jni接口,不过较为类似,如果有生成工具,稍加修改,就可以适配.

xianjimli commented 5 years ago

好的,周末我研究一下。

xianjimli commented 4 years ago

AWTK-JAVA基本功能可以用了:https://github.com/zlgopen/awtk-java

digitalgust commented 4 years ago

真快,我看看怎么移植过来.

xianjimli commented 4 years ago

我对JAVA不熟,你先帮我看看有没有原则性的问题。这两天我先把minijvm AWTK jni的代码产生器写出来,后面你来集成到minijvm吧。

xianjimli commented 4 years ago

基本代码已经生成了:https://github.com/zlgopen/awtk-minijvm

编译和集成还不清楚怎么搞,你有空帮忙弄一下吗?

minijvm非常棒,minijvm 加上 AWTK在嵌入式linux系统上大有可为。

digitalgust commented 4 years ago

我抽时间先看一下

xianjimli commented 4 years ago

我发现一个问题,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)
digitalgust commented 4 years ago

我还没有编译出awtk库,在centos上没有编译成功, 刚把ubuntu装好,晚上编译一下

digitalgust commented 4 years ago

你说的这个问题,参见 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;
    }
...
}
digitalgust commented 4 years ago

ubuntu编译 awtk 看起来很顺利,明天应该可以看一下绑定代码了

xianjimli commented 4 years ago

在枚举里貌似不能loadLibary,我加了demos,你有空试试。

./mini_jvm -cp ../lib/minijvm_rt.jar:../libex/janino.jar:../libex/awtk_gui.jar:../libex/awtk_demos.jar DemoButton
digitalgust commented 4 years ago

加个QQ联系啊,30600449

digitalgust commented 4 years ago

确实有个问题,因为优化性能,把类初始化太早,导致还没有加载本地库就调用了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) 
xianjimli commented 4 years ago

QQ

我加你了,你确认一下。

xianjimli commented 4 years ago

绑定里面出现函数声明和使用参数类型不对的情况,生成函数有问题

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) 

你更新一下代码。我这里可以运行了。还有两个小问题:

xianjimli commented 4 years ago

基本功能可以了,剩下一个问题,如何获取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   }
digitalgust commented 4 years ago

调用java方法后,返回值在栈顶,不用处理,或者从栈顶弹出,再压回去

xianjimli commented 4 years ago

调用java方法后,返回值在栈顶,不用处理,或者从栈顶弹出,再压回去

我需要把它取出来放到一个变量里,应该怎么弄呢?

digitalgust commented 4 years ago

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   }
xianjimli commented 4 years ago

好的。谢谢。基本功能都可以了。你可以更新代码玩一下。

digitalgust commented 4 years ago

非常赞