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 就可以看到结果了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值