基于上两篇java调用dll的文章,我做了更为复杂的参数传递,指针变量和结构体变量,下面给出源码
vc++中的工程名称是SMSXIAO
Source Files(源文件):.c文件名:sms.c
源码:
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程序
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
源码:
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 就可以看到结果了!
把动态链接库SMSXIAO.dll拷贝到TSendSMS.class所在的目录下,java SMSXIAO 就可以看到结果了!