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

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

基于上两篇java调用dll的文章,我做了更为复杂的参数传递,指针变量和结构体变量,下面给出源码

vc++中的工程名称是SMSXIAO

Source Files(源文件):.c文件名:sms.c

源码:

#include "sms.h"

int SmsInit(void)

{

printf("welcome");

return 1;

}

int SmsSend(char *phonenum, char *content)

{

printf("liuxiao");

printf("%s %s",phonenum,content);

return 2;

}

int SmsRead(int x,SmsEntry *entry)

{

int i;

printf("mingxin");

printf("%d",x);

for (i=0;i<2;i++)

{

printf("%f",entry->text[i]);

}

return 3;

}

所对应的Header Files(头文件) .h文件名:sms.h

源码:

/*

* SMS API

* Author: liuxiao

* Date: 2007.2.2

*/

#ifndef _TX_SMS_H_

#define _TX_SMS_H_

#ifdef __cplusplu*

**tern "C" {

#endif

typedef struct tagSmsEntry {

int index;

double text[40];

} SmsEntry;

int SmsInit(void); //无参数

int SmsSend(char *phonenum, char *content); //指针变量参数

int SmsRead(int x,SmsEntry *entry); //结构体参数

#ifdef __cplusplus

}

#endif

#endif

有了上述的两个文件,就说明sms.h是别人给你的接口,你要通过java去调用相应的方法,而sms.c 是模拟的

测试类,下面需要做的是java程序

Java Source(java原码) .java文件名:SendSMS.java

源码:

public class SendSMS {

public native  int SmsInit();

public native  int SmsSend(byte[] mobileNo, byte[] smContent);

public   native   int SmsRead(int  x,int y,double[]  cText);

public static void main(String[] args) {

System.loadLibrary("SMSXIAO");

int x=1;int y=3;

double[]   text=   new   double[40]; text[0] =1.1;text[1] =1.2;

byte[] mobileno = { 0x31, 0x33, 0x36, 0x36, 0x31, 0x36, 0x33, 0x30, 0x36, 0x36, 0x37,

0x00};

String smscontentemp = "早上好";

byte[] temp = {0};

try {

byte[] smscontentdb = smscontentemp.getBytes("gbk");

byte[] smscontent = new byte[smscontentdb.length + temp.length];

System.arraycopy(smscontentdb, 0, smscontent, 0, smscontentdb.length);

System.arraycopy(temp, 0, smscontent, smscontentdb.length, temp.length);

SendSMS sendSMS = new SendSMS();

sendSMS.SmsInit();

sendSMS.SmsRead(x,y,text);

if (sendSMS.SmsSend(mobileno, smscontent) >= 0) {

System.out.println("success!");

}

else {

System.out.println("failed!");

}

}catch (Exception ex) {}

}

}

javac SendSMSjava生成.class文件,javach SendSMS生成.h文件,按照上编日志,把.h文件导入工程的

Header Files里。

相对于SendSMS.h文件要写出SendSMS.c文件,目的是生成自己的.dll库文件供java去调用。

.c文件名:SendSMS.c

源码:

#include 

typedef struct chuanStruts

{

int y;

double doubletext[40];

}smsstruts;

JNIEXPORT jint JNICALL Java_SendSMS_SmsInit(JNIEnv *ev, jobject obj)

{

return SmsInit();//调用sms.c里的SmsInit方法

}

JNIEXPORT jint JNICALL Java_SendSMS_SmsSend(JNIEnv *ev, jobject obj, jbyteArray mobileno, jbyteArray smscontent)

{

char * psmscontent ;

//jsize thearraylengthj = (*env)->getarraylength(env,mobileno);

jbyte * arraybody = (*ev)->GetByteArrayElements(ev,mobileno,0);

char * pmobileno = (char *)arraybody;

printf("[%s]/n ", pmobileno);

//jsize size = (*env)->getarraylength(env,smscontent);

arraybody = (*ev)->GetByteArrayElements(ev,smscontent,0);

psmscontent = (char *)arraybody;

return SmsSend(pmobileno,psmscontent); //调用sms.c里的SmsSend方法

}

JNIEXPORT jint JNICALL Java_SendSMS_SmsRead (JNIEnv *ev, jobject obj, jint x,jint y, jdoubleArray doubletext)

{

smsstrut* **ample;//自己构建的example结构体变量

double * psmscontent ;

int i;

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);

}

return SmsRead(x,&example);  //调用sms.c里的SmsRead方法

}

如果没有出错,则此时生成动态链接库成功. 此时的SMSXIAO.dll,就应该在你工程的Debug中

把动态链接库SMSXIAO.dll拷贝到TSendSMS.class所在的目录下,java SMSXIAO 就可以看到结果了!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值