java调用c 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 <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?就可以看到結果了!
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?就可以看到結果了!
總結
以上是生活随笔為你收集整理的java调用c dll,指针参数和结构体参数搞定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JNI之C语言简单回顾
- 下一篇: 使用DLL进行不同语言之间的调用