• 选择颜色:
| 设为首页

Java 语言添加一个native函数的过程:

上一篇 / 下一篇  2008-05-30 18:12:23 / 个人分类:Linux编程

查看( 18 ) / 评论( 0 )
Java 语言添加一个native函数的过程:
$g6l,A4K/C+?k0 大连IT门户S#xn5~/^+B"{V}
主要步骤如下:
h)Vg2T6F1y#i$]x0 大连IT门户igr8kG!D8Ko'k%N
1. 编写java文件. 在本例中是名字是umpFileMain.java
X%\1q V@-|5{&_2f@*j0 大连IT门户0Q7G5UPEBT
代码如下:
hu e y4w0 大连IT门户|(jt*gnCL-h
/**大连IT门户9b;_F!n'X
*大连IT门户-I2}!F7mMt
* version 0.00
P6\d%e4]w0 * Copyright (C) 2008 Chen Zuopeng
%hCft4D GZhH9l0 * czp.opensource@gmail.com
C$kP$s3|/pBz0 * http://www.mydlit.com大连IT门户@lo jSgm(F
* This program is free software; you can redistribute it and/or modify
)O)h d wd,uI0 * it under the terms of the GNU General Public License as published by大连IT门户 ?9y+F9{%p5F
* the Free Software Foundation; either version 2 of the License, or
EBlXN5{y+E["z0 * (at your option) any later version.大连IT门户8O BM+M ov~
*/
{tl+o I-GC0 大连IT门户-W2mx/[r&L
public class DumpFileMain
#Ha1~*S,|#d|r0 {大连IT门户5h"Ld j)S6c,byD
public static void main (String [] args)大连IT门户9E&R:?1EI&j
{大连IT门户^@1Xq nR3l.I
//DumpFile.DumpFileToScreen (args[1]);
3eI!]S"A0 DumpFile.DumpFileToScreen (”./DumpFile.cpp”);
~1I4OEr0 }
`bB5vJ [P/I6m0 static
9B mO|i0 {大连IT门户yu\[w5~ Z#Dr)Y6L
System.loadLibrary(”dumpfile”); //这是要生成的动态链接库的名字::libdumpfile.so
|)^(d_!@0 }大连IT门户\p(cBoYP6s
}
u't2A g7}%}ij_.^ x.jg!?0
3Y u x-D$q7?q5j!m0 class DumpFile大连IT门户lc,RS}^ov
{
"]&_S*M~'U,[0 public static int DumpFileToScreen (String fileName)大连IT门户j X5d v6^D3`@"k
{大连IT门户&uM%Nsm,E
return nativeDumpFileToScreen (fileName);
#\l.j b8j A6Z#U#|0 }
*l*i6Z1z%f[Xnq$J0 public static native int nativeDumpFileToScreen (String fileName); //这是要调用的C函数的Java的原型
^5K2e q'|3X0 }大连IT门户.D#U3A+I7L+BpG\

7c0Sx;V)V U*S0 2. 编译.java文件大连IT门户U}S U h-m f^

-A*g1P/B@c0 在终端下运行javac DumpFileMain.java大连IT门户#Dwr s k
大连IT门户w#a?l%Z!S,a!r)B
将会生成DumpFileMain.class文件大连IT门户O ]Q0m(b| }(`2j R*A

{m6Z(XrPw)yr;C1W0 3. 生成C或C++的头文件
3d,Y1e0yl \ h+^?e-n;`0
3n.B$G8^0w%[0 在终端下输入javah DumpFile
&Z#]+v\&S0
8gB&OJf*],Y _{0 将会成生DumpFile.h头文件内容如下:大连IT门户X%^{%Y Qu
大连IT门户)N \ZQ'wat#a
/* DO NOT EDIT THIS FILE - it is machine generated */大连IT门户[f]1f?;\7W
#include <jni.h>
2BCV[N7cv7z0 /* Header for class DumpFile */
#B1V"R9Gm?l K0 大连IT门户.g(_-M'j/m/u:u|
#ifndef _Included_DumpFile
^H X%Cw5Jq%o!U*hD0 #define _Included_DumpFile大连IT门户.V~hIEX5W \:{
#ifdef __cplusplus
bNpxQ[3V0 extern “C” {大连IT门户/N%] E|/nCP&[
#endif
`/U"e3^iSM0 /*大连IT门户/UE \!E~Wc
* Class: DumpFile大连IT门户9T;o,z}F9^
* Method: nativeDumpFileToScreen
fA/RUG-F h0 * Signature: (Ljava/lang/String;)I大连IT门户4J\Vj1ckT7NIi
*/
D }Z.LYp/K5` N;s0 JNIEXPORT jint JNICALL Java_DumpFile_nativeDumpFileToScreen大连IT门户^9I3K*e\,]$L{*[i)S
(JNIEnv *, jclass, jstring);大连IT门户gy,q"n)l&r5E g
大连IT门户l7u"P;Frqq
#ifdef __cplusplus大连IT门户 hs5G;W[5QQ0|
}
%^8O&X5msl0 #endif大连IT门户z5~ }|A
#endif
JjH-f1Q$n}DW&f"u0 大连IT门户 WO@"j/V-B6K
4. 对JNICALL Java_DumpFile_nativeDumpFileToScreen函数的实现
F$T }yOtE8}0 大连IT门户7m;^o*}0f7p ^LQ
编写一个DumpFile.cpp文件或DumpFile.c文件,内容如下:
lf3kc-?ciZ^0
@ |5u6@ZeJ*g0 /**大连IT门户/U J4rM$m0HK5i8\
*
vwZ"n l0 * version 0.00大连IT门户&NHs.dR~'@0k|
* Copyright (C) 2008 Chen Zuopeng
3F(DBK9Ff)oT_#{0 * czp.opensource@gmail.com
/E.W6v)n!w D? W0 * http://www.mydlit.com
ylp7QC)Mq0 * This program is free software; you can redistribute it and/or modify
Q W0H$G)v9Gq0 * it under the terms of the GNU General Public License as published by
\@)E ^#fw0 * the Free Software Foundation; either version 2 of the License, or大连IT门户6h YjIc#c'Q? _[
* (at your option) any later version.大连IT门户+|'BT/V IeL[
*/大连IT门户 ~@^'T)W
大连IT门户:hO mmo*WE"~
#include <iostream>
:x!t+]Vx~\m@!h0 #include <assert.h>
s,vIB7H MF A0 #include <fstream>大连IT门户P8]Sm7x@5C
#include “DumpFile.h”大连IT门户.X5{.iS-W)x
大连IT门户_`6Ou R8M6C.{:Vl
static int DumpFileToScreen (const char* pFile);
d_f6l)m"L0 #ifdef DEBUG
jYyog5sG0 int main (int argc, char** argv)大连IT门户 _*W_%Q GNsk
{大连IT门户4[L WY@$F
if (argc != 2)
m3_E#|y.t B0 {
8@Uhx#}o_0 std::cerr << “Invalid parameters” << std::endl;
'~s V;V V){V/N0 return -1;大连IT门户5DQ`UdrUL;Am2f*{
}
2n`HD%i M$_.a(C0 DumpFileToScreen (argv[1]);
M5h!ov r2}5d0 return 0;
#q's,Prjid0 }大连IT门户(we QM@'^_:n
#endif //DEBUG
0R%G!h,Y#[K0
"LC$yk]0 static int DumpFileToScreen (const char* pFile)大连IT门户,NuD4F z'g4R?m7z4Lh
{大连IT门户 G2| bIHAi;W
assert (pFile);大连IT门户 Ge2Zk(X.n1X
if (pFile == 0)
9jd'{Y;[5uU0 {
%`*R EED3E)t0 return -1;大连IT门户5sj X}$mX
}
mpS,pXET/E0 std::ifstream in (pFile);大连IT门户:A%o.d/I(h@0dv-su
assert (in);大连IT门户:E%kso$E5o
if (in == 0)
K7}8q@iQx$u M2r+e0 {大连IT门户+n(p `4b:OX
std::cerr << “Failed to open file::” << pFile << std::endl;大连IT门户$wp-v&B/?K)~
return -1;
hll-m'd,BgVEL0 }
-HD2P'F2u[0 std::cout << in.rdbuf () << std::endl;
*YSk6M?0 return 0;
dO-Xn4~o0 }
X]2ZKP)Ep0
[}[ ~ ?.s0 JNIEXPORT jint JNICALL Java_DumpFile_nativeDumpFileToScreen(JNIEnv *env, jclass clazz, jstring fileFullName)大连IT门户k qpi1L
{
\)u"v0A{0 int rVal = 0;
U-gCd9?0 const char* c_str_name = (const char*) env->GetStringUTFChars (fileFullName, NULL);大连IT门户~!M~k%\M9E_\s
if (c_str_name == NULL)
$A7@ nHD:P8lf0 {
3dzs O%l*X#L0 return -1;
F-[lIL(T:j0 }大连IT门户q fI9F7[ JV.P'J
rVal = DumpFileToScreen (c_str_name);
.|j3Yz-zy0 if (c_str_name != NULL)
Puz\Z0 {大连IT门户4hN7C;BW1Tjq0u
env->ReleaseStringUTFChars(fileFullName, c_str_name);
9F'| e X[%DJ"V0 }大连IT门户qK]#F2b oI
return rVal;大连IT门户*`S|2~,ZVa_
}
2zw!G5w R]1C0
ED+Z"i2?0 5. 下一步就是生成动太链接库了, Java只能动态链接native函数
d g$e @/x!M iDFc0
l~'b](?i0 gcc(g++) -shared -o libDumpFile.so DumpFile.c (DumpFile.cpp) -I.大连IT门户C:g/C^ pyf i

y2\'U9M2j(PV0 6. 好了, 所有的工作都做完了, 可以跑了, 为了让代码可以找到libDumpFile.so文件要先export LD_LIBRARY_PATH=./一下.
#~@}i3r0 大连IT门户J9ak$GK)u
输入java DumpFileMain.class
2wVeXV7R0 大连IT门户K.iM([[ vb x
done!! ^_^大连IT门户r/h6y#{"z9h
大连IT门户O _PWjm*K` [

java_native_ex.zip
k+eQ9N3B0s.QL!l0(2008-05-30 13:30:35, Size: 2.51 KB, Downloads: 0)大连IT门户t G?1t[




相关阅读:

TAG: java native javanative

我来说两句

(可选)

Java 语言添加一个native函数的过程:发布网友