终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖醋排骨,呵呵,还是把我的研究成果纪录下来吧!
基于上两篇java调用dll的文章,我做了更为复杂的参数传递,指针变量和结构体变量,下面给出源码
vc++中的工程名称是SMSXIAO
SourceFiles(源文件):.c文件名:sms.c
源码:
#include"sms.h"
intSmsInit(void)
{
printf("welcome");
return1;
}
intSmsSend(char*phonenum,char*content)
{
printf("liuxiao");
printf("%s%s",phonenum,content);
return2;
}
intSmsRead(intx,SmsEntry*entry)
{
inti;
printf("mingxin");
printf("%d",x);
for(i=0;i<2;i++)
{
printf("%f",entry->text[i]);
}
return3;
}
所对应的HeaderFiles(头文件).h文件名:sms.h
源码:
/*
*SMSAPI
*Author:liuxiao
*Date:.2.2
*/
#ifndef_TX_SMS_H_
#define_TX_SMS_H_
#ifdef__cplusplu*
**tern"C"{
#endif
typedefstructtagSmsEntry{
intindex;
doubletext[40];
}SmsEntry;
intSmsInit(void);//无参数
intSmsSend(char*phonenum,char*content);//指针变量参数
intSmsRead(intx,SmsEntry*entry);//结构体参数
#ifdef__cplusplus
}
#endif
#endif
有了上述的两个文件,就说明sms.h是别人给你的接口,你要通过java去调用相应的方法,而sms.c是模拟的
测试类,下面需要做的是java程序
JavaSource(java原码).java文件名:SendSMS.java
源码:
publicclassSendSMS{
publicnativeintSmsInit();
publicnativeintSmsSend(byte[]mobileNo,byte[]smContent);
publicnativeintSmsRead(intx,inty,double[]cText);
publicstaticvoidmain(String[]args){
System.loadLibrary("SMSXIAO");
intx=1;inty=3;
double[]text=newdouble[40];text[0]=1.1;text[1]=1.2;
byte[]mobileno={0x31,0x33,0x36,0x36,0x31,0x36,0x33,0x30,0x36,0x36,0x37,
0x00};
Stringsmscontentemp="早上好";
byte[]temp={0};
try{
byte[]smscontentdb=smscontentemp.getBytes("gbk");
byte[]smscontent=newbyte[smscontentdb.length+temp.length];
System.arraycopy(smscontentdb,0,smscontent,0,smscontentdb.length);
System.arraycopy(temp,0,smscontent,smscontentdb.length,temp.length);
SendSMSsendSMS=newSendSMS();
sendSMS.SmsInit();
sendSMS.SmsRead(x,y,text);
if(sendSMS.SmsSend(mobileno,smscontent)>=0){
System.out.println("success!");
}
else{
System.out.println("failed!");
}
}catch(Exceptionex){}
}
}
javacSendSMSjava生成.class文件,javachSendSMS生成.h文件,按照上编日志,把.h文件导入工程的
HeaderFiles里。
相对于SendSMS.h文件要写出SendSMS.c文件,目的是生成自己的.dll库文件供java去调用。
.c文件名:SendSMS.c
源码:
#include
typedefstructchuanStruts
{
inty;
doubledoubletext[40];
}smsstruts;
JNIEXPORTjintJNICALLJava_SendSMS_SmsInit(JNIEnv*ev,jobjectobj)
{
returnSmsInit();//调用sms.c里的SmsInit方法
}
JNIEXPORTjintJNICALLJava_SendSMS_SmsSend(JNIEnv*ev,jobjectobj,jbyteArraymobileno,jbyteArraysmscontent)
{
char*psmscontent;
//jsizethearraylengthj=(*env)->getarraylength(env,mobileno);
jbyte*arraybody=(*ev)->GetByteArrayElements(ev,mobileno,0);
char*pmobileno=(char*)arraybody;
printf("[%s]/n",pmobileno);
//jsizesize=(*env)->getarraylength(env,smscontent);
arraybody=(*ev)->GetByteArrayElements(ev,smscontent,0);
psmscontent=(char*)arraybody;
returnSmsSend(pmobileno,psmscontent);//调用sms.c里的SmsSend方法
}
JNIEXPORTjintJNICALLJava_SendSMS_SmsRead(JNIEnv*ev,jobjectobj,jintx,jinty,jdoubleArraydoubletext)
{
smsstrut***ample;//自己构建的example结构体变量
double*psmscontent;
inti;
jdouble*arraybody=(*ev)->GetDoubleArrayElements(ev,doubletext,0);
psmscontent=(double*)arraybody;
printf("%f",*psmscontent);
printf("%f",*(psmscontent+1));
example.y=y;
for(i=0;i<2;i++)
{
example.doubletext[i]=*(psmscontent+i);
}
returnSmsRead(x,&example);//调用sms.c里的SmsRead方法
}
如果没有出错,则此时生成动态链接库成功.此时的SMSXIAO.dll,就应该在你工程的Debug中
把动态链接库SMSXIAO.dll拷贝到TSendSMS.class所在的目录下,javaSMSXIAO就可以看到结果了!