1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java调用dll 指针参数_java调用c dll 指针参数和结构体参数搞定

java调用dll 指针参数_java调用c dll 指针参数和结构体参数搞定

时间:2019-06-19 20:06:28

相关推荐

java调用dll 指针参数_java调用c dll 指针参数和结构体参数搞定

终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖醋排骨,呵呵,还是把我的研究成果纪录下来吧!

基于上两篇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就可以看到结果了!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。