终于有了比较大的成果,不过身体也累完了,昨天又去打的吊瓶,坐成铁的时候差点就晕倒在里面了,不知道什么原因,抵抗力这么差,明天放假,要在家好好休息,今天早上碰到欢欢了,她说给我做好吃的,我愿意吃她做的糖醋排骨,呵呵,还是把我的研究成果纪录下来吧! 基于上两篇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 就可以看到结果了!
java调用dll 参数是结构体_java调用c dll,指针参数和结构体参数搞定
最新推荐文章于 2022-01-19 10:45:32 发布