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 <jni.h>
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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值