📄 java jni1.htm
字号:
google_ad_height = 15;
google_ad_format = "468x15_0ads_al_s";
google_ad_channel ="3984443469";
google_color_border = "EDF0F5";
google_color_bg = "EDF0F5";
google_color_link = "0000FF";
google_color_url = "008000";
google_color_text = "000000";
//--></SCRIPT>
<SCRIPT src="Java JNI1.files/show_ads" type=text/javascript>
</SCRIPT>
</TD></TR></TBODY></TABLE>
<DIV id=article>
<TABLE cellSpacing=0 cellPadding=0 width=575 border=0>
<TBODY>
<TR>
<TD height=3></TD></TR>
<TR>
<TD vAlign=bottom align=right><A
href="http://www.qqread.com/java/w120282060_2.html">下一页</A> <FONT
color=#ff0000>1</FONT> <A
href="http://www.qqread.com/java/w120282060_2.html">2</A> <A
href="http://www.qqread.com/java/w120282060_3.html">3</A> </TD></TR>
<TR>
<TD class=height170><FONT class=f14 id=zoom> 最近在公司里做了一个手机的项目,需要<A
href="http://www.qqread.com/keywords/java.html"
target=_blank>JAVA</A>程序在发送短信的时候和第三方的短信服务器连接。短信接口是用<A
href="http://www.qqread.com/keywords/cpp.html"
target=_blank>C++</A>写的。琢磨了三天,大致搞懂了JNI的主体部分。先将心得整理,希望各位朋友少走弯路。<BR><BR> 首先引用一篇文章,介绍一个简单的JNI的调用的过程。<BR>
<TABLE style="MARGIN: 10px 8px 3px 7px" cellSpacing=0 cellPadding=0
align=left border=0>
<TBODY>
<TR>
<TD><SPAN
id=ad_qqread_mid_big></SPAN></TD></TR></TBODY></TABLE> JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。<BR> JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在<A
href="http://www.qqread.com/keywords/windows.html"
target=_blank>WINDOWS</A>平台上是DLL文件形式,在<A
href="http://www.qqread.com/keywords/unix.html"
target=_blank>UNIX</A>机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。<BR><BR> 简单介绍及应用如下:
<BR> 一、JAVA中所需要做的工作 <BR> 在JAVA程序中,首先需要在类中声明所调用的库名称,如下: <BR>
<P class=code>static { <BR>System.loadLibrary(“goodluck”);
<BR>}</P><BR> 在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
<BR><BR> 还需对将要调用的方法做本地声明,关键字为native。且只需要声明,而不需要具体实现。如下: <BR>
<P class=code>public native static void set(int i); <BR>public
native static int
get();</P><BR> 然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
<BR><BR> 例如程序testdll.java,内容为: <BR>
<P class=code>public class testdll <BR>{ <BR>static <BR>{
<BR>System.loadLibrary("goodluck"); <BR>} <BR>public native static
int get(); <BR>public native static void set(int i); <BR>public
static void main(String[] args) <BR>{ <BR>testdll test = new
testdll(); <BR>test.set(10); <BR>System.out.println(test.get());
<BR>} <BR>}</P><BR> 用javac testdll.java编译它,会生成testdll.class。
<BR> 再用javah
testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
<BR><BR> 二、C/C++中所需要做的工作
<BR> 对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
<BR> 接上例子。我们先看一下testdll.h文件的内容: <BR>
<P class=code>/* DO NOT EDIT THIS FILE - it is machine generated */
<BR>#include <JNI.H><BR>/* Header for class testdll */ <BR>#ifndef
_Included_testdll <BR>#define _Included_testdll <BR>#ifdef
__cplusplus <BR>extern "C" { <BR>#endif <BR>/* <BR>* Class: testdll
<BR>* Method: get <BR>* Signature: ()I <BR>*/ <BR>JNIEXPORT jint
JNICALL Java_testdll_get (JNIEnv *, jclass); <BR>/* <BR>* Class:
testdll <BR>* Method: set <BR>* Signature: (I)V <BR>*/ <BR>JNIEXPORT
void JNICALL Java_testdll_set (JNIEnv *, jclass, jint); <BR>#ifdef
__cplusplus <BR>} <BR>#endif
<BR>#endif</P><BR> 在具体实现的时候,我们只关心两个函数原型 <BR> JNIEXPORT jint
JNICALL Java_testdll_get (JNIEnv *, jclass); 和 <BR> JNIEXPORT void
JNICALL Java_testdll_set (JNIEnv *, jclass,
jint);<BR><BR> 这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
<BR><BR> 好,下面我们用testdll.cpp文件具体实现这两个函数: <BR>
<P class=code>#include "testdll.h" <BR>int i = 0; <BR>JNIEXPORT jint
JNICALL Java_testdll_get (JNIEnv *, jclass) <BR>{ <BR>return i;
<BR>} <BR>JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass,
jint j) <BR>{ <BR>i = j;
<BR>}</P><BR> 编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll
。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
<BR><BR clear=all></FONT></TD></TR></TBODY></TABLE></DIV>
<TABLE cellSpacing=0 cellPadding=0 width=575 border=0>
<TBODY>
<TR>
<TD height=10></TD></TR>
<TR>
<TD align=right><A
href="http://www.qqread.com/java/w120282060_2.html">下一页</A> <FONT
color=#ff0000>1</FONT> <A
href="http://www.qqread.com/java/w120282060_2.html">2</A> <A
href="http://www.qqread.com/java/w120282060_3.html">3</A> </TD></TR>
<TR>
<TD> </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=575 border=0>
<TBODY>
<TR>
<TD align=right colSpan=2 height=19>【<A title="Java: JNI完全手册"
style="CURSOR: hand"
onclick="window.external.addFavorite(document.location.href,'Java: JNI完全手册')"
?>收藏此页</A>】【<A href="javascript:doZoom(16)">大</A> <A
href="javascript:doZoom(14)">中</A> <A
href="javascript:doZoom(12)">小</A>】【<A
href="javascript:doPrint()">打印</A>】【<A
href="javascript:window.close()">关闭</A>】 </TD></TR>
<TR>
<TD height=50><SPAN class=channel>上一篇:</SPAN><A
title="自己动手 让组装机也来一键恢复"
href="http://www.qqread.com/skill/h110660000.html"
target=_blank>自己动手 让组装机也来一键恢复</A><BR><SPAN
class=channel>下一篇:</SPAN><A title=定期更新密码才能够永保安全问答
href="http://www.qqread.com/skill/a601794001.html"
target=_blank>定期更新密码才能够永保安全问答</A><BR></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=575 border=0>
<TBODY>
<TR>
<TD align=middle height=15><SPAN id=google_ad_468x60></SPAN></TD></TR>
<TR>
<TD bgColor=#c6c9d1 height=1></TD></TR>
<TR>
<TD height=10></TD></TR></TBODY></TABLE>
<TABLE class=headframe cellSpacing=1 cellPadding=3 width=572 border=0>
<TBODY>
<TR>
<TD align=middle><IFRAME marginWidth=0 marginHeight=0
src="res://C:\WINDOWS\system32\shdoclc.dll/dnserror.htm"
frameBorder=0 width=558 scrolling=no
height=135></IFRAME></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=1 width=575 border=0>
<TBODY>
<TR>
<TD width=285>
<TABLE class=bottomframe cellSpacing=1 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD class=title_rellink>热门相关链接</TD></TR>
<TR>
<TD class=height130>·<A title=java程序-JPTXXXXXXX1.91
href="http://www.qqread.com/encrypt/c400190062.html"
target=_blank>java程序-JPTXXXXXXX1.91</A><BR>·<A
title=Apple释放修复Java隐患补丁
href="http://www.qqread.com/news/n559103001.html"
target=_blank>Apple释放修复Java隐患补丁</A><BR>·<A
title="我的Thinking in Java学习笔记"
href="http://www.qqread.com/itlife/y712161000.html"
target=_blank>我的Thinking in Java学习笔记</A><BR>·<A
title=Java高手的感叹:走向J2EE,漫长的道路
href="http://www.qqread.com/itlife/w812161000.html"
target=_blank>Java高手的感叹:走向J2EE,漫长的道路</A><BR>·<A title=我的Java之路
href="http://www.qqread.com/itlife/y412162000.html"
target=_blank>我的Java之路</A><BR>·<A title="路漫漫其修远兮 Java的发展路在何方"
href="http://www.qqread.com/itlife/m212167000.html"
target=_blank>路漫漫其修远兮 Java的发展路在何方</A><BR>·<A
title=小议学习Java的浮躁心态
href="http://www.qqread.com/itlife/a512167000.html"
target=_blank>小议学习Java的浮躁心态</A><BR>·<A title=教你如何成为一名Java初级程序员
href="http://www.qqread.com/itlife/h712700000.html"
target=_blank>教你如何成为一名Java初级程序员</A><BR>·<A
title=追MM与Java的23种设计模式
href="http://www.qqread.com/itlife/h712881000.html"
target=_blank>追MM与Java的23种设计模式</A><BR>·<A
title="Microsoft和Sun角斗结束 Java将进入Wiondows XP"
href="http://www.qqread.com/itlife/z791145002.html"
target=_blank>Microsoft和Sun角斗结束
Java将进入W</A><BR></TD></TR></TBODY></TABLE></TD>
<TD width=5> </TD>
<TD width=285>
<TABLE class=bottomframe cellSpacing=1 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD class=title_rellink>最新相关链接</TD></TR>
<TR>
<TD class=height130>·<A
title="连接PHP和 Java -- PHP/Java Bridge [2]"
href="http://www.qqread.com/java/2006/05/l006111002.html"
target=_blank>连接PHP和 Java -- PHP/Java Bridge </A><BR>·<A
title="JDBC 4.0规范之目标"
href="http://www.qqread.com/java/2006/05/w026111002.html"
target=_blank>JDBC 4.0规范之目标</A><BR>·<A title=Java程序员的存储过程
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -