JAVA JNI 呼叫C語言 Demo
專案中由於mail送信部分要求使用C實現,並且使用訊息佇列通訊。 因此這就需要WEB_APP中呼叫C程式。 JAVA中如何呼叫C,這就使用到了JAVA提供的JNI介面。雖然從沒接觸過C,甚至學校裡也沒學過,但還是應客戶要求,我寫了個Demo。包含
JAVA透過JNI呼叫C,以及C透過JNII呼叫JAVA。
關於訊息佇列的使用,這裡我就不作說明
JAVA呼叫C:
無非如下步驟:
1.建立本地方法的JAVA程式碼。
2.建立原生程式碼對應的.h檔案。
3.實現可裝載的C程式碼。
[@more@]〔事前條件〕
Web Server Application 執行送信、中止、通知的處理。
〔事後條件〕
傳送“訊息依賴”到訊息佇列中。等待Daemon接收。
〔處理內容〕
1.C檔案裝載
編碼例
static { System.load(MailJni.o"); }
2.定義Native 方法
編碼例
public native boolean SendMailMsg(); public native boolean StopMailMsg(String deliverId); public native boolean sendMailNotice();
3.MailJni類作成jp_co_docomo_sms_common_util_MailJni.h標頭檔案。
操作命令
Javah –jni jp.co.docomo.sms.common.util.MailJni
4. 作成可裝載的C程式碼。
方法名及引數要與原生程式碼對應的.h檔案的定義相對應。
JAVA CLASS
// Copyright(c) 2006.
//
// $Id:$
// $Log:$
//
package jp.co.docomo.sms.common.util;
/**
* MailJniEB
*
* @version $Revision:$ $Date:$
*/
public class MailJni {
public MailJni() {
}
public native boolean SendMailMsg();
public native boolean StopMailMsg(String deliverId);
public native boolean sendMailNotice();
static {
// System.loadLibrary("MailJni.o");
// Linux hack, if you can't get your library
// path set in your environment:
System.load(
"/usr/eclipse/workspace/MAILJNI/MailJni.o");
}
public static void main(String[] args) {
System.out.println("MailJni starting; args.length" + args.length);
MailJni mailJni= new MailJni();
boolean re= mailJni.sendMailNotice();
System.out.println("Back in java");
}
}
MailJni.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "msg_ipc.h"
#include "./jp_co_docomo_sms_common_util_MailJni.h"
jboolean Java_jp_co_docomo_sms_common_util_MailJni_SendMailMsg(JNIEnv* env,
jobject this) {
int crtdmnid = msgcreate("/var", 'a', IPC_CREAT|00666);
msgsbuf *msg_sbuf;
msg_sbuf = (msgsbuf*)malloc(sizeof(msgsbuf));
char text[] ="send";
msg_sbuf->mtype = 2;
strcpy (msg_sbuf->mtext, text);
if (sendmessages(crtdmnid, msg_sbuf,0) == -1) {
return 0;
}
printf("send 'send mail' msg to create Daemon n");
return 1;
}
jboolean Java_jp_co_docomo_sms_common_util_MailJni_StopMailMsg(JNIEnv* env,
jobject this, jstring jMsg) {
const char* id=(*env)->GetStringUTFChars(env,jMsg,0);
int crtdmnid = msgcreate("/var", 'a', IPC_CREAT|00666);
msgsbuf *msg_sbuf;
msg_sbuf = (msgsbuf*)malloc(sizeof(msgsbuf));
char text[10];
strcpy(text, id);
msg_sbuf->mtype = 1;
strcpy (msg_sbuf->mtext, text);
if (sendmessages(crtdmnid, msg_sbuf,0) == -1) {
return 0;
}
printf("send 'stop mail' msg to create Daemon n");
return 1;
}
jboolean Java_jp_co_docomo_sms_common_util_MailJni_sendMailNotice(JNIEnv* env,
jobject this) {
printf("call method from java n");
int notdmnid = msgcreate("/var", 'e', IPC_CREAT|00666);
msgsbuf *msg_sbuf;
msg_sbuf = (msgsbuf*)malloc(sizeof(msgsbuf));
char text[] ="notice";
msg_sbuf->mtype = 1;
strcpy (msg_sbuf->mtext, text);
if (sendmessages(notdmnid, msg_sbuf,0) == -1) {
return 0;
}
printf("send 'notice mail' msg to Notice Daemon: %dn", notdmnid);
return 1;
}
msg_ipc.h
#ifndef MSG_IPC_H_
#define MSG_IPC_H_
#include
typedef struct msgsbuf
{
long mtype;
char mtext[10];
}msgsbuf;
typedef struct msgrbuf
{
long mtype;
char mtext[10];
}msgrbuf;
int sendmessages(int msqid, struct msgsbuf *sbuf, int msgflg)
{
int length;
length = sizeof(struct msgsbuf) - sizeof(long);
return msgsnd (msqid, sbuf, length, msgflg);
}
int readmessage(int msqid, int type, struct msgrbuf *rbuf, int msgflg)
{
int length;
length = sizeof(struct msgrbuf) - sizeof(long);
return msgrcv(msqid, rbuf, length, type, msgflg);
}
int msgcreate(char* msgpath, char proj, int flags) {
key_t key=ftok(msgpath,proj);
int msgid=msgget(key,flags);
if(msgid==-1)
{
printf("msg create errorn");
}
return msgid;
}
#endif /*MSG_IPC_H_*/
Make file
# Author yunchat yunchat@hotmail.com
# (c) Bruce Eckel 2000
# Copyright notice in Copyright.txt
# Automatically-generated MAKEFILE
# For examples in directory .appendixb
# using the JDK 1.2 compiler
# Invoke with: make
JVC = javac
JVCFLAGS =
.SUFFIXES : .class .java
.java.class :
$(JVC) $(JVCFLAGS) $<
# Microsoft Visual C++:
CPP=cl
DLLFLAG=-LD
OFLAG=-Fe
# Borland C++. A command-line version of this compiler
# is available for free download from
#
#CPP=bcc32
#DLLFLAG=-WD
#OFLAG=-o
# IMPORTANT: Adjust this for your environment:
#WININCLUDE = -Ic:/ProgTools/Java/include -Ic:/ProgTools/Java/include/win32
UNIXINCLUDE = -I/usr/local/j2sdk1.4.2_08/include -I/usr/local/j2sdk1.4.2_08/include/linux
#dos:
# ShowMessage.class
# UseObjects.class
# MailJni.class
# MsgImpl.dll
# UseObjImpl.dll
# MailJni.dll
linux:
./jp/co/docomo/sms/common/util/MailJni.class
MailJni.o
MailJni.class: ./jp/co/docomo/sms/common/util/MailJni.java
MailJni.h: MailJni.class
javah -jni jp.co.docomo.sms.common.util.MailJni
#MsgImpl.dll: MsgImpl.cpp ShowMessage.h
# $(CPP) $(WININCLUDE) $(DLLFLAG) MsgImpl.cpp $(OFLAG)MsgImpl.dll
#UseObjImpl.dll: UseObjImpl.cpp UseObjects.h
# $(CPP) $(WININCLUDE) $(DLLFLAG) UseObjImpl.cpp $(OFLAG)UseObjImpl.dll
MailJni.o: MailJni.c MailJni.h
gcc -o MailJni.o -shared -Wl,-soname,MailJni.o $(UNIXINCLUDE)
MailJni.c -static -lc
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/118026/viewspace-818300/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C語言 JNI 呼叫JAVA DemoC語言Java
- Java如何呼叫C語言程式,JNI技術JavaC語言
- JNI開發系列③C語言呼叫Java欄位與方法C語言Java
- C語言呼叫 Java(Linux)C語言JavaLinux
- java呼叫c++動態庫之jni呼叫JavaC++
- java開發C語言編譯器:為C語言提供API呼叫JavaC語言編譯API
- go語言與c語言的相互呼叫GoC語言
- Android JNI實現Java與C/C++互相呼叫,以及so庫的生成和呼叫(JNI方式呼叫美圖秀秀so)AndroidJavaC++
- C++庫封裝JNI介面——實現java呼叫c++C++封裝Java
- 使用 Rust 語言編寫 Java JNI 實現RustJava
- C語言函式呼叫棧C語言函式
- Android JNI開發系列之Java與C相互呼叫AndroidJava
- android使用JNI呼叫C,C++程式AndroidC++
- MediaScanner Java, JNI, mediaservice 呼叫關係Java
- C語言動態呼叫庫(轉)C語言
- Music Studio專案心得--JNI實現C++呼叫JAVAC++Java
- JNI:Java程式碼呼叫原生程式碼Java
- C語言關於多原始檔的呼叫C語言
- JAVA呼叫C語言下的DLL檔案JavaC語言
- android實現app通過jni呼叫C/C++方法AndroidAPPC++
- Linux下跨語言呼叫C++實踐LinuxC++
- c語言是如何處理函式呼叫的?C語言函式
- 在Windows Phone專案中呼叫C語言DLLWindowsC語言
- Java語言與C++語言的差異總結JavaC++
- Java與C語言的區別?JavaC語言
- C語言 C語言野指標C語言指標
- C語言---“C語言 誰與爭鋒?”C語言
- 從彙編角度分析C語言的過程呼叫C語言
- 深入理解 C 語言的函式呼叫過程函式
- 深入理解C語言的函式呼叫過程C語言函式
- Android Studio NDK開發-JNI呼叫Java方法AndroidJava
- C、C++、Java?Java Native Interface(JNI)特輯——C反射java函式C++Java反射函式
- Java語言和C++語言的差異 (轉)JavaC++
- C語言C語言
- Android Studio NDK開發:JNI呼叫Java函式AndroidJava函式
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- c如何呼叫javaJava
- 初學計算機語言者(C語言,C++,java,pytion,C#)計算機C語言C++JavaC#