java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定 | 学步园
終于有了比較大的成果,不過身體也累完了,昨天又去打的吊瓶,坐成鐵的時候差點(diǎn)就暈倒在里面了,不知道什么原因,抵抗力這么差,明天放假,要在家好好休息,今天早上碰到歡歡了,她說給我做好吃的,我愿意吃她做的糖醋排骨,呵呵,還是把我的研究成果紀(jì)錄下來吧!
基于上兩篇java調(diào)用dll的文章,我做了更為復(fù)雜的參數(shù)傳遞,指針變量和結(jié)構(gòu)體變量,下面給出源碼
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;
}
所對應(yīng)的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);?//無參數(shù)
int?SmsSend(char?*phonenum,?char?*content);?//指針變量參數(shù)
int?SmsRead(int?x,SmsEntry?*entry);?//結(jié)構(gòu)體參數(shù)
#ifdef?__cplusplus
}
#endif
#endif
有了上述的兩個文件,就說明sms.h是別人給你的接口,你要通過java去調(diào)用相應(yīng)的方法,而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文件導(dǎo)入工程的
Header?Files里。
相對于SendSMS.h文件要寫出SendSMS.c文件,目的是生成自己的.dll庫文件供java去調(diào)用。
.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();//調(diào)用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);?//調(diào)用sms.c里的SmsSend方法
}
JNIEXPORT?jint?JNICALL?Java_SendSMS_SmsRead?(JNIEnv?*ev,?jobject?obj,?jint?x,jint?y,?jdoubleArray?doubletext)
{
smsstrut*?**ample;//自己構(gòu)建的example結(jié)構(gòu)體變量
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);??//調(diào)用sms.c里的SmsRead方法
}
如果沒有出錯,則此時生成動態(tài)鏈接庫成功.?此時的SMSXIAO.dll,就應(yīng)該在你工程的Debug中
把動態(tài)鏈接庫SMSXIAO.dll拷貝到TSendSMS.class所在的目錄下,java?SMSXIAO?就可以看到結(jié)果了!
總結(jié)
以上是生活随笔為你收集整理的java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定 | 学步园的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【12月原创】RT-thread - 柿
- 下一篇: linux查看usr利用率,在Linux