|
Windows是个大家都耳熟能详的单词,它最让人熟悉的就是微软的PC操作系统,而旗下的Windows Mobile就没有那么有名气了,虽然是出自同一家公司,但是Windows Mobile却没有那么好的口碑,我总结了原因大概有以下几点:一,不开源,这使得开发做起来只能自己研究,遇到问题在网也很难得到解答;二开发太因难,首先C/C++中内存泄漏,悬空指针,数组边界违规这些都是经常要注意的问题,还有在Windows mobile中除UI界面实现的难度外,海量数据与反应要求的冲突,也很难解决.其次界面,控件太少,要独自开发等等主要的瓶颈就在这里.;三Windows Mobile手机平台使用率太低(手机太少),很难引起大家的重视;
但是相对于windows mobile,在新的3G平台(Ophoen和Android)中开发中显得十分简单了.那么什么是OPhone呢?
我简单介绍下OPhone,。OPhoen是中移动和播思通讯自去年开始基于Linux2.6,主导开发的自主创新的手机操作系统。该系统直接内置了中移动的服务菜单、音乐随身听、手机导航、号簿管家、139邮箱、飞信、快讯和移动梦网等3G特色业务;那么Android是什么呢? Android 是Google开发的基于Linux2.6平台的开源手机操作系统.它包括操作系统、用户界面和应用程序--移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍.
从以上面的介绍可以看出,这二个操作系统都是以3G为搭载平台,我们知道现在的3G业务正刚刚起步,刚刚进入发展阶段,如果这个时候有个好的切入点能够进入3G,绝对是个好的时会.那么我就先研究了一下,发现OPhone和Android的SDK中没有包括JNI的支持,而且对如何支持JNI也没有任何文档说明.不过既然整个OPhone平台是开源的,我们可以通过一些源代码来找到一些线索(比如frameworks/base/media/jni/目录),依葫芦画瓢的实现上层JAVA程序通过JNI来调用Native C程序中的函数.
依照下面的步骤可以实现一个非常简单的JNI的实例程序:首先编写C模块,实现动态库.(如何在OPhone中编译C模块的更多细节,请参考<OPhone编译环境(1) - 编译Native C的helloworld模块>)在development目录下添加新目录hellolib,并添加hellolib.c和OPhone.mk文件.hellolib.c的内容如下:
#include <jni.h>
#define LOG_TAG "TestLib"
#undef LOG
#include <utils/Log.h>
JNIEXPORT void JNICALL Java_com_test_TestHelloLib_printHello(JNIEnv * env, jobject jobj)
{
LOGD("Hello LIB!\n");
}
注意这里的函数名需要按照JNI的规范(因此也可以用javah -jni工具来生成头文件,来保证函数名的正确性),Java_com_test_TestHelloLib_printHello的命名对应后面在java代码中,package名字是com.test,类名是TestHelloLib,native函数名是printHello.
另外,LOGD及#define LOG_TAG "TestLib"等打印log的方式是采用了OPhone所提供的LOG机制,这样才能通过OPhone的logcat工具看到log.用于编译C模块的OPhone.mk文件内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hellolib.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libhello
include $(BUILD_SHARED_LIBRARY)
该文件中的一些变量分别对应的含义如下:
LOCAL_SRC_FILES - 编译的源文件
LOCAL_C_INCLUDES - 需要包含的头文件目录
LOCAL_SHARED_LIBRARIES - 链接时需要的外部库
LOCAL_PRELINK_MODULE - 是否需要prelink处理(参考prelink的详细介绍:<动态库优化——Prelink(预连接)技术>,OPhone的Toolchain, prelink工具:<OPhone Toolchain与Bionic Libc>)
LOCAL_MODULE - 编译的目标对象
BUILD_SHARED_LIBRARY - 指明要编译成动态库
接下来回到OPhone顶层目录,并执行make libhello来编译:
# cd $(YOUR_OPHONE) && make libhello
target thumb C: libhello <= development/hellolib/hellolib.ctarget SharedLib: libhello (out/target/product/generic/obj/SHARED_LIBRARIES/libhello_intermediates/LINKED/libhello.so)
target Non-prelinked: libhello (out/target/product/generic/symbols/system/lib/libhello.so)
target Strip: libhello (out/target/product/generic/obj/lib/libhello.so)
Install: out/target/product/generic/system/lib/libhello.so
编译结果可得到位于out/target/product/generic/system/lib/目录的动态共享库libhello.so,这样的话,我们就可以得到了一个简单的JNI.研究到了这里我猛然间意识到有一大笔很大的财福正在向我招手.因为我本来就是学C/C++,且又是在WM工作,有着手机平台的经验.未来的OPhoneOS一定会有大量的市场就业机会和高薪位置,所以现在开始学习或投入OPhoneOS的开发绝对是非常好的选择.这还是下一代手机平台的先峰,酬劳多不说,又可以找简单快乐的工作.那我为什么不选择这个Ophoen或Android平台呢?
今天在手机早报中看到:中国移动网上软件店上线了,工程师自己开发了手机软件可以在这个在线商店上直接销售分成。好像中国移动在OphoneOS的官方网站(http://www.ophonesdn.com)上也正在举行发帖赢OPhone手机的活动.想想看,中国移动的手机用户占70%的市场,未来创造的3G工程师就业机会也会很多。 |
|