`
isiqi
  • 浏览: 16488024 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

J2ME中调用系统API C函数

阅读更多
本帖原名

增加KVM中的系统调用API

大家都晓得KVM是不支持Native函数调用的,如果要增加一些系统调用的API,那么只能加到KVM内部。同时,不同的J2ME设备,也有不同的系统调用API以及它们的实现。我们从SUN那么下载到原始的KVM源代码,如何为其增加一个系统调用API呢?本文以具体实践的步骤一步一步来讲解增加KVM系统API的方法。

其实为KVM增加一个系统调用API比为Linux增加一个系统调用API还简单。大致就分成两步工作就完成。一步是在classes.zip中增加一个你自己新增的class,一步是在KVM的nativeCore.c中实现这个新增的class的native api函数。

下面以org.test.MiniTest这个新增的class为例来实现一个TestInt()系统调用函数。函数的功能很简单,就是返回一个整数9999。

1. 新增org.test.MiniTest类

从SUN那里下载到j2me_cldc 1.1版本的KVM代码后。在j2me_cldc\api目录下,增加org\test\MiniTest.Java的包目录以及java文件。然后写上如下的代码:

package org.test;
public class MiniTest
{
public static native int TestInt();
}

2. 进行第一次编译

根据上一篇文章中的KVM编译方法,在命令提示符下,跳到目录j2me_cldc\build\win32下,输入make命令进行第一次整体编译。不过,这次编译过程在编译连接KVM中的*.o文件的时候,会提示一个找到_Java_org_test_MiniTest_TestInt符号的错误提示。

增加KVM中的系统调用API(图一)

点击查看大图

这是因为在我们只是在org.test.MiniTest中定义了这个native函数TestInt,但是并没有在KVM的任何一个c文件中实现其对应的函数。

首先编译过程是用javac来编译j2me_cldc/api里面的所有的*.java文件,然后将其class文件打包成一个classes.zip,然后JCC这个工具会默认根据classes.zip生成ROMJavaWin.c和nativeFunctionTableWin.c。而在ROMJavaWin.c声明这个native函数:

extern void Java_org_test_MiniTest_TestInt(void);

3. 实现Java_org_test_MiniTest_TestInt函数

从KVM中的代码可以看到,KVM默认都是把一些native函数放到了nativeCore.c这个文件里面。你也可以自己去新增一些C程序文件,不过本例就把这个Java_org_test_MiniTest_TestInt放在了nativeCore.c文件。

下面是代码:

void Java_org_test_MiniTest_TestInt(void)
{
pushStack(9999);
}

这里为什么把返回值使用pushStack这个宏来返回的原因就不好说了,关于JAVA运行的方式其实就是一个堆栈,Java的字节码其实就是一种栈式语言,这个在编译原理里面的中间代码生成那一章可以找到它的原型和其说明。再者,还可以看《Inside Java Virtual Machine》这本书。

4. 第二次编译

第二次编译就是可以生成真正的kvm.exe文件了。还是跟第一次编译以及上一篇编译KVM的方法一样,敲入make命令即可。

5. 测试MiniTest.TestInt这个API

自己写了一个Test的类,来测试这个API:

import org.test.*;
class Test {
public static void main(String[] args) {
System.out.println("Test Result = "+MiniTest.TestInt());
}
}

用javac编译的时候,需要把前面的j2me_cldc/classes.zip拷贝过来,执行:

javac -classpath classes.zip Test.java

kvm -classpath . Test

可以看到结果:

增加KVM中的系统调用API(图二)

点击查看大图
分享到:
评论

相关推荐

    J2ME中文API帮助文档

    在Java ME(J2ME)平台上,开发移动和嵌入式设备的应用程序时,API扮演着至关重要的角色。本文将详细解析J2ME中文API,特别是...J2ME中文API帮助文档为开发者提供了详细的类和方法说明,是开发过程中的重要参考资料。

    j2me Canvas调用中文输入法

    2. **初始化输入法**:在Canvas的构造函数或者初始化方法中,你需要调用库提供的初始化函数,以准备使用中文输入法。 3. **监听事件**:因为Canvas没有内置的文本输入事件,你需要监听键盘事件,比如KeyListener或...

    j2me中文Api

    本文将对“j2me中文API”中提及的关键接口和类进行详细介绍。 #### 二、MIDlet类 MIDlet是J2ME应用程序的核心,每个应用至少包含一个MIDlet实例。 - **构造函数** - `MIDlet()`: 默认构造函数,用于创建MIDlet实例...

    j2me API帮助文档

    远程过程调用是一种软件设计模式,使得一个程序可以调用另一个程序(通常在不同的网络节点上)的函数或方法,就像它们在同一台计算机上一样。J2ME RPC库为小型设备提供轻量级的RPC解决方案,简化了设备间的交互,这...

    J2ME中电话记录储存的实现源码

    在J2ME中,由于访问这些系统级数据的能力受限,我们可能需要利用特定的设备API,如JSR-120 Personal Profile (PP) 或 JSR-253 Mobile Telephony Services (MTS),来获取和操作这些数据。然而,需要注意的是,不是...

    J2ME 发短信 源码

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,主要用于移动设备、嵌入式系统等资源受限的环境。在这个J2ME发短信的源码示例中,我们将探讨如何在移动设备上利用Java编程实现短信发送功能。 首先,我们...

    j2me api中文版

    ### J2ME API知识点概述 #### 一、基础概念 **J2ME(Java 2 Micro Edition)** 是Sun Microsystems为嵌入式设备和移动设备提供的Java平台版本。它主要针对资源有限的设备,例如手机、PDA和个人数字助理等。 #### ...

    j2me手机上的文件浏览器

    - 在 `MobileFileBrowser` 构造函数中,初始化了 `Display`, `List`, `Command` 等组件,并设置了命令监听器。 - `startApp()` 方法调用了 `getRoots()` 方法,以获取设备的根目录信息。 - `commandAction()` 方法...

    J2ME自己做的贪吃蛇游戏

    同时,使用定时器(Timer)来定期调用更新函数,保证游戏的流畅性。 6. **数组或链表管理蛇的位置**:贪吃蛇的身体由多个位置点组成,这些位置点可以使用数组或链表来存储。每次蛇移动,需要在数组或链表中添加新的...

    《J2ME MIDP手机游戏程序设计》源码

    6. **Animation and Timing**:在J2ME中,通过调用`Thread.sleep()`或使用Timer类来控制动画的帧速率,确保游戏流畅运行。 7. **Resource Management**:由于移动设备资源有限,高效地管理内存和资源(如图片、音频...

    J2ME 之RMS 很基础很全面

    在J2ME中,RMS(Record Management System)是一个小型的数据库管理系统,专门设计用于在资源有限的设备如手机上进行数据存储和持久化。RMS提供了简单且高效的数据管理方式,适用于那些无法使用全功能数据库系统的...

    j2me手机游戏开发基础

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,专门用于开发小型设备,如手机、智能手表等嵌入式系统的应用程序。在本文中,我们将深入探讨J2ME手机游戏开发的基础知识。 首先,开发环境的配置至关重要。...

    J2ME文件系统(从手机读取文件,递归存储器目录)

    本教程将深入探讨J2ME文件系统,包括其工作原理、API使用以及如何在手机上读取文件和递归遍历存储器目录。 1. **J2ME文件系统基础** J2ME文件系统并不像Java Standard Edition (Java SE) 中的java.io.File那样提供...

    J2ME中文帮助文档

    通过以上列举的类和异常,我们可以看到J2ME提供了一套丰富的API来支持移动应用的开发。这些API不仅涵盖了基本的UI构建和网络通信,还涉及多媒体处理、文件系统访问等多个方面。开发者可以根据实际需求选择合适的类和...

    j2me手机游戏——俄罗斯方块!

    - **继承关系**:`Game` 类继承自 `Canvas` 类,这是J2ME中用于绘制图形的基本组件。 - **实现 Runnable 接口**:通过实现 Runnable 接口,`Game` 类可以被线程调用,从而实现游戏循环。 - **成员变量**: - `...

    J2ME浮点库MathFP

    3. **MathFP库功能**:掌握库提供的各种数学函数,例如三角函数、指数、对数、平方根等,以及如何在J2ME程序中调用这些函数。 4. **多版本支持**:理解MathFP的不同版本可能存在的差异,以及如何选择适合项目需求的...

    j2me手要移动开发技术播放器

    6. **文件系统交互**: 为了存储和读取本地媒体文件,开发者需要熟悉 J2ME 中的文件系统接口,如 RecordStore API,这是一个用于存储小数据块的简单数据库系统。对于较大的文件,可能需要通过 FileConnection API 来...

    j2me连连看代码.rar_j2me 游戏_j2me 连连看_小游戏代码_连连看 java_连连看 j2me

    J2ME由配置(Configurations)、 profiles(配置文件)和API三部分组成。其中,MIDP(Mobile Information Device Profile)是J2ME中用于移动设备的标准配置,它提供了图形用户界面、网络通信、数据存储等基本功能。...

Global site tag (gtag.js) - Google Analytics