工作日志

** 懒惰, 没有借口 **

逝者如斯
网志文件夹
· 所有网志
· 待完成
· 已完成
· 未分类
最新评论
搜索本站
友情链接
· 我们的小歪
· 管理我的Blog

订阅 RSS

0004686

歪酷博客


Jaty @ 2005-03-17 16:19

先建立一个空目录, 为DATABASE
在 DATABASE目录上右键菜单, 选择"在此创建文件库"
然后COPY 你需要的文件到一个新目录, 作为初始样本, 去掉垃圾东东
在其目录上右键菜单, 选择"导入" ,再选择刚才新创建的库,

最后在某个空目录里选择导出, 作为工作目录, 就可以被监控版本了.


 
Jaty @ 2005-01-19 14:39

javac HelloWorld.java
javah HelloWorld

java_[包名+]类名_java方法名,例如:
Java_com_xipos_local_LocalCall_localIARBuild

至于DLL, 放在JAR的CLASS目录就可以

cd E:\Program Files\Microsoft Visual Studio\VC98\Bin
VCVARS32.BAT

   在windows下面使用下面的语句:

cl -Ie:\j2sdk1.4.1\include -I e:\j2sdk1.4.1\include\win32  -LD  LocalCall.c Advapi32.lib -FeLocalCall.dll

jni得简单使用

以一个最简单的HelloWorld程序来介绍一下JNI的最基本的使用方法:

1)首先要有一个HelloWorld.java。

这个是主文件,里面包括本地方法的java声明,一个main函数,还有一个静态代码段,用来导入所需要的动态连接库(在windows里是.dll)。

代码如下:

//HelloWorld.java
class HelloWorld {
   public native void displayHelloWorld(String send_buf);//注意关键字native,这就说明这个方法是用本地方法实现的。
   static {//静态代码段里面导入了hello.dll。
       System.loadLibrary("hello");
   }
   public static void main(String[] args) {//调用本类的displayHelloWorld方法,(当然了方法实际上是用c语言实现的)
       new HelloWorld().displayHelloWorld("test param\n");
   }
}


2)编译HelloWorld.java。

使用语句为:

javac HelloWorld.java

3)使用javah命令生成一个.h文件。
使用语句为:

javah HelloWorld

  这就是实现displayHelloWorld()方法的c文件的头文件。文件名为HelloWorld.h代码如下:

   /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     HelloWorld
* Method:    displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

可以看到,这个文件里面主要就是需要在c文件里面实现的方法的方法声明。这个声明和java文件HelloWorld.java的有一点区别,原来的方法不带参数,可是现在有了两个参数。

这两个是任何一个本地方法都必须有的参数。

第一个参数是JNIEnv*,它用于连接从java应用程序传给你的本地方法的参数和对象。第二个参数是一个jobject,它指向当前对象本身,你也可以把它理解为java里面的this变量。对于一个本地实例方法,比如这个例子里的displayHelloWorld方法,jobject参数就是一个对象当前实例的引用。对于本地类的方法,这个参数就是一个方法类的引用。在这个例子里面不需要使用这两个参数。

   另外一点,可以发现方法的名称和java文件里的不一致,这个方法名由以下几部分组成:

java_[包名+]类名_java方法名

4)编写实现本地方法的c文件

//本例中起名为HelloWorldImp.c

#include <jni.h>
#include "HelloWorld.h"
#include <windows.h>

#include <stdio.h>

#include "stdlib.h"

#include "string.h"

char* jstringToWindows( JNIEnv  *env, jstring jstr )

{

 int length = (*env)->GetStringLength(env,jstr );

 const jchar* jcstr = (*env)->GetStringChars(env,jstr, 0 );

 char* rtn = (char*)malloc( length*2+1 );

 int size = 0;

 size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );

 if( size <= 0 )

   return NULL;

 (*env)->ReleaseStringChars(env,jstr, jcstr );

 rtn[size] = 0;

 return rtn;

}



jstring WindowsTojstring( JNIEnv* env, char* str )

{

 jstring rtn = 0;

 int slen = strlen(str);

 unsigned short* buffer = 0;

 if( slen == 0 )

   rtn = (*env)->NewStringUTF(env,str );

 else

 {

   int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );

   buffer = malloc( length*2 + 1 );

   if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )

     rtn = (*env)->NewString( env, (jchar*)buffer, length );

 }

 if( buffer )

 free( buffer );

 return rtn;

}


JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj, , jstring text)
{
   const char * recvtest = jstringToWindows( env, text );
   printf("Hello world! \n %s \n",recvtest);
   return;
}

5)建立动态连接库

cd E:\Program Files\Microsoft Visual Studio\VC98\Bin
VCVARS32.BAT

   在windows下面使用下面的语句:

cl -Ie:\j2sdk1.4.1\include -I e:\j2sdk1.4.1\include\win32  -LD HelloWorldImp.c -Fehello.dll

       这里面有几部分。Ie:\j2sdk1.4.1是本地的java home的路径。在include和include\win32目录下面有产生动态连接库需要的几个.h文件,包括jni.h(在所有的实现native方法的c文件里面都要include这个文件)等等。

       将产生的.dll文件放到环境变量path能找到的目录下。现在运行命令:

        java HelloWorld

        就会看到如下输出:

 G:\localj> java HelloWorld
Hello world!
test param

   这就是一个最简单的JNI使用方法。



 
Jaty @ 2005-01-14 14:11

path c:\IAR\bin\;%path%

set C_INCLUDE=c:\IAR\inc\
set XLINK_DFLTDIR=c:\IAR\lib\

大小写敏感


 
Jaty @ 2004-12-17 17:54

我们只需要终端部分的处理, 即是说:接受发送MMS\处理PUSH来的消息(不需要PUSH出去)\PULL需要吗?
而WAP是一种高层协议,其承载可以是CSD、GPRS、SMS、USSD、cdma 1x等。WAP在现网上的实现方式主要有两种,即WAP over CSD方式和WAP over GRPS方式。对于移动智能网系统来说,以上这两种实现方式是没有差别的。 --- 也就是说, 与GSM模块或者AT没有关系.只要接通 GPRS 或者CSD,就需要我们自己去解释数据流了.

现在需要BUILD出MIPS的MMS库, 就要先BUILD出XML的库(MIPS)....

http://sourceforge.net/projects/mmsclient/
This is an MMS client for linux. Use it in combination with a GSM modem to receive and send SMS and MMS messages.

Bb_boxc.c --- 总控制各个thread, 直到所有的thread都退出.
List *outgoing_wdp;

初始化 WAP部分
main() -> init_bearerbox()-> start_wap()->wapbox_start(cfg, outgoing_wdp, incoming_wdp); -> gwthread_create(startwapbox, startinfo) ->启动wapbox的thread

Wapbox.c
List *outgoing_wdp;
startwapbox()
也依然用
   while (program_status != shutting_down) {
       WAPEvent *dgram;

       msg = list_consume(startinfo->incoming_wdp);
这样一个循环来处理WAP的EVENT



在下面这里循环处理发送接收等等
 while (list_consume(flow_threads)!=NULL);

推送框架主要包括推送发起者(PI)、推送代理网关(PPG)和推送客户(PC)三个功能部份。PI位于Internet中,通过推送访问协议(PAP)同PPG通信,PPG是Internet网和移动网之间的访问接入点,通过推送空间传输协议(P-OTA)完成从PPG到推送客户的数据传输任务。基本的工作过程如下:当有消息要推送到客户时,PI首先根据消息的内容和性质构造推送消息,通过PAP协议向PPG发出推送请求,PPG收到请求后进行一些必要的处理工作(包括压缩、协议转换、安全认证等),然后通过P-OTA协议将推送内容传送给客户端。客户端收到推送消息后,根据消息内容和服务类型同用户进行交互。WAP的推送协议中针对不同的用户需求定义了服务指示和服务加载两种服务,可根据推送消息的性质选择使用。

从实现的角度看,一般PI是运行于Internet端的一台独立的服务器,负责收集推送信息和发起推送请求。由于PPG和客户端间的通信是由运行于WSP之上的P-OTA协议完成,所以PPG通常是和WAP网关集成在一起。在客户端,为了能够随时收到来自PPG的推送消息,必须在后台始终运行一个推送消息监听程序。另外,由于面向连接的推送请求需要在客户端和服务器端有激活的WSP会话,而WSP连接的建立无法由服务器端发起,所以在客户端中引入了会话初始化程序,以监听来自服务器的会话建立请求,建立并激活WSP会话。

⑶ 推送空间传输协议(P-OTA)

P-OTA是运行于WSP之上的一层较为简单的协议层,负责从PPG到客户代理的数据传输。P-OTA可使用面向连接的会话和无连接会话两种WSP层服务,对于使用连接会话的推送,需要在PPG和客户端间预先存在一个激活的会话上下文;对于无连接的推送,则通过预留的端口完成通信。

⑷ 服务指示(SI)和服务加载(SL)

推送消息送到移动设备后,通常只需显示给用户即可,但用户可能会有些不同的需求。WAP的推送协议中定义了服务指示和服务加载两项服务,以给用户和网络运营者更多的选择。服务加载是将一项服务的URI推送给用户,然后客户端自动的使用拉技术根据该URI启动服务。服务指示是将新信息的指示和相关的URI推送给用户,由用户选择是立即处理信息或以后处理。两种服务的区别在于用户是否介入推送信息的处理过程。SL对推送信息的处理对用户来说是透明的,而SI则在指示用户的同时,请用户对随后的处理做出选择。


有点看不明白, --- 首先就不明白.def 是干什么用的
而且看不懂究竟在什么地方真正地发出了AT指令. --- 甚至没见到AT命令表.跟到最后也不过是write 某个 fd而已.
sendWSPMSendReq()
sendHTTPMSendReq()
的区别, 就应该不至于没WSP部分.

createSendReqPDU()
mms_pdu_pack()
这两个不知道是不是合适的东东


 
Jaty @ 2004-11-16 18:00

http://www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
请大家DOWNLOAD 到public\wap_documents 并将已经DOWNLOAD的写到下面,以免重复,谢谢




 
Jaty @ 2004-11-15 17:17

printf("~~~~~~~~~~~ fatalSlotError caller: %p \n", __builtin_return_address(0));


 
Jaty @ 2004-10-20 11:22

export PATH=/opt/ar2001/bin/:$PATH
export ALT_BOOTDIR=/home/wang/j2sdk
export ALT_BOOTDIR=/home/wang/j2sdk1.4.2_04/
export KVM_DIR=/usr/src/ar2001/j2me/j2me_cldc-1_0_4
export LANG=en_US.ISO8859_1

[root@new-server kvm]# pwd
/usr/src/ar2001/j2me/midp2.0fcs/build/uclinux/kvm

make midp
make midp GUIIN=/home/jaty/xgui/inc
make midp GUIIN=/usr/src/ar2001/j2me/midp2.0fcs/src/solaris/native/inc

[root@new-server kvm]# cd bin
[root@new-server bin]# cp ../../../linux/kvm/bin/preverify ./
[root@new-server bin]# cp ../../../linux/kvm/bin/extractOffsets ./

[root@new-server kvm]#mkdir bin
[root@new-server bin]# cp ../../linux/kvm/bin/preverify ./bin
[root@new-server bin]# cp ../../linux/kvm/bin/extractOffsets ./bin


 
Jaty @ 2004-09-29 13:49

# # initflash 192 1023
# # mkfs.minix /dev/flash0