如何写一个非常简单的native方法。 大家能否详细说明一下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关注一下, 但一般native方法都是调用本调文件中的方法,如DLL中的方法, 好像这类方法有个规范什么的, 我也想详细知道一下,等答案.... 这个问题看不太懂,方法不就是你自己写的么?想简单就写些简单的语句。jni技术本身不难,google下就知道了。java的编写主要是装入库文件,然后按jni的规则写好方法原型;native的方法要定义在dll或者so文件中,然后把动态链接文件,java文件放在一个目录下。 给你个例子,记得是从JAVAEYE看到的先javac HelloJNI.java再使用javah -jni HelloJNI生成HelloJNI.h文件// HelloJNI.java -- 简单的JNI入门示例。 // 2007-4-5 16:41:45 public class HelloJNI { public native void displayHello () ; public native void showTime () ; /// private native String getLine ( String prompt ) ; static { //这一句是用来装载hello.dll的 System.loadLibrary ( "hello" ) ; } public int HelloJNI(){return 2;} public static void main ( String [] args ) throws Exception { HelloJNI hj = new HelloJNI () ; System.out.println (hj.HelloJNI()) ; System.out.println ( "==> Demo 1: hello" ) ; hj.displayHello () ; System.out.println ( "==> Demo 2: time" ) ; hj.showTime () ; System.out.println ( "==> Demo 3: input" ) ; String input = hj.getLine ( "Type a line: " ) ; System.out.println ( "User typed: " + input ) ; } } 以下是对应的C++实现代码,使用vs里的cl.exe编译生成hello.dll文件这一步,你可以在命令行状态下使用该命令,我用的是VS2005,CL在E:\Program Files\Microsoft Visual Studio 8\VC\bin下,其他版本的目录都差不多如果你想在任意目录下使用CL.exe请设置以下环境变量:1.INCLUDE变量:主要是源文件用到的一些包含文件的目录 以下是我机器上设置的值(因为还要用到JAVA安装目录下得包含文件,比如jni.h,这个只在JAVA安装目录下有)E:\Program Files\Microsoft Visual Studio 8\VC\include;E:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include;E:\Program Files\Java\jdk1.6.0_13\include;E:\Program Files\Java\jdk1.6.0_13\include\win322.LIB变量:主要是源文件使用的一些LIB文件目录 我机器上的设置:E:\Program Files\Microsoft Visual Studio 8\VC\lib;E:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib3.PATH变量:主要是要系统能找到要执行的CL命令以及CL.exe所需要的其他一些文件目录 这里我把生成hello.dll的目标路径D:\My Documents\Visual Studio 2005\Projects也加进来了,方便在执行java HelloJNI命令时可以直接找到Hello.dll,而不用将他们放到一个目录下。D:\My Documents\Visual Studio 2005\Projects;E:\Program Files\Microsoft Visual Studio 8\VC\bin;E:\Program Files\Microsoft Visual Studio 8\Common7\IDE;%INCLUDE%;%LIB%在命令行使用cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloJNIImpl.cpp -Hello.dll 生成hello.dll文件,我的文件生成在D:\My Documents\Visual Studio 2005\Projects目录下// HelloJNIImpl.cpp -- 自己编写的实现文件 // 2007-4-5 16:52:53 #include <jni.h> #include <iostream> #include <ctime> #include <string> #include <cstdio> #include <windows.h> #include "HelloJNI.h" extern "C" { // } using namespace std; JNIEXPORT void JNICALL Java_HelloJNI_displayHello ( JNIEnv * env, jobject obj ) { cout << "Hello, JNI tech. This is from C++!" << endl; } JNIEXPORT void JNICALL Java_HelloJNI_showTime ( JNIEnv * env, jobject obj ) { time_t sec; tm t; time_t loop; cout << "时间:" ; sec = time ( NULL ) ; t = *localtime ( &sec ) ; unsigned int hour = t.tm_hour; unsigned int mini = t.tm_min; unsigned int secd = t.tm_sec; if ( hour < 10 ) { cout << "0" << hour; } else { cout << hour; } cout << ":" ; if ( mini < 10 ) { cout << "0" << mini; } else { cout << mini; } cout << ":" ; if ( secd < 10 ) { cout << "0" << secd; } else { cout << secd; } cout << endl; } JNIEXPORT jstring JNICALL Java_HelloJNI_getLine ( JNIEnv * env, jobject obj, jstring prompt ) { char buf [ 128 ] = { 0 } ; const char * str = ( env ) ->GetStringUTFChars ( prompt, 0 ) ; // printf("%s", str); cout << str; ( env ) ->ReleaseStringUTFChars ( prompt, str ) ; string buffer; getline ( cin, buffer ) ; // scanf("%s", buf); return ( env ) ->NewStringUTF ( buffer.c_str ()) ; } 最后运行java HelloJNI就OK了最后给你个参考的百度知道,其实这方面搜一下很多的,你多搜搜就清楚了http://baike.baidu.com/view/1272329.htm 是不是c/c++里边的方法头要与java的native定义的方法头是一致的? 好像是用javah工具可以生成.h文件头的呀 JNIEXPORT jstring JNICALL Java_HelloJNI_getLine ( JNIEnv * env, jobject obj, jstring prompt ) 这个是有规范的,你可以搜一下,网上太多了C/C++里的方法名字是Java_ + HelloJNI(ClassName) + _getLine(methodName) 如果JAVA中的方法声明中没有参数,C/C++里默认参数是这两个( JNIEnv * env, jobject obj),env从字面上看代表环境指针,obj如果方法是静态方法,那么obj参数代表类,否则代表类的实例如果有的话就在加在后面,类型怎么对应的你还是看一看规范吧我记得的就只有这么多了,前两天我想了解一下JNI,搜了一下例子,调通了,然后就没再深入看了,o(︶︿︶)o 唉,搞这东西,又得回去捡C/C++了,呵呵 谁有软件开发课堂 《Java基础与案例开发详解》 徐明华等写的这本书的光盘内容? htmlparser问题 JAVA优缺点之陆陆版 如何实现这样的数组 简单的以字节流方式读取文件!简单例题 Java运行时问题 同一包中类的调用问题。 think in java(三) 一个小问题,可我不知怎样解决。 请各位进来帮忙解答 服务器的问题 {一个有关信息的处理程序}
但一般native方法都是调用本调文件中的方法,如DLL中的方法,
好像这类方法有个规范什么的,
我也想详细知道一下,等答案....
先javac HelloJNI.java
再使用javah -jni HelloJNI生成HelloJNI.h文件// HelloJNI.java -- 简单的JNI入门示例。
// 2007-4-5 16:41:45
public class HelloJNI {
public native void displayHello () ;
public native void showTime () ; ///
private native String getLine ( String prompt ) ;
static {
//这一句是用来装载hello.dll的
System.loadLibrary ( "hello" ) ;
}
public int HelloJNI(){return 2;}
public static void main ( String [] args ) throws Exception {
HelloJNI hj = new HelloJNI () ;
System.out.println (hj.HelloJNI()) ;
System.out.println ( "==> Demo 1: hello" ) ;
hj.displayHello () ;
System.out.println ( "==> Demo 2: time" ) ;
hj.showTime () ;
System.out.println ( "==> Demo 3: input" ) ;
String input = hj.getLine ( "Type a line: " ) ;
System.out.println ( "User typed: " + input ) ;
}
} 以下是对应的C++实现代码,使用vs里的cl.exe编译生成hello.dll文件
这一步,你可以在命令行状态下使用该命令,我用的是VS2005,CL在E:\Program Files\Microsoft Visual Studio 8\VC\bin下,其他版本的目录都差不多
如果你想在任意目录下使用CL.exe
请设置以下环境变量:
1.INCLUDE变量:主要是源文件用到的一些包含文件的目录
以下是我机器上设置的值(因为还要用到JAVA安装目录下得包含文件,比如jni.h,这个只在JAVA安装目录下有)
E:\Program Files\Microsoft Visual Studio 8\VC\include;E:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include;E:\Program Files\Java\jdk1.6.0_13\include;E:\Program Files\Java\jdk1.6.0_13\include\win322.LIB变量:主要是源文件使用的一些LIB文件目录
我机器上的设置:
E:\Program Files\Microsoft Visual Studio 8\VC\lib;E:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib3.PATH变量:主要是要系统能找到要执行的CL命令以及CL.exe所需要的其他一些文件目录
这里我把生成hello.dll的目标路径D:\My Documents\Visual Studio 2005\Projects也加进来了,方便在执行java HelloJNI命令时可以直接找到Hello.dll,而不用将他们放到一个目录下。
D:\My Documents\Visual Studio 2005\Projects;E:\Program Files\Microsoft Visual Studio 8\VC\bin;E:\Program Files\Microsoft Visual Studio 8\Common7\IDE;%INCLUDE%;%LIB%在命令行使用cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloJNIImpl.cpp -Hello.dll 生成hello.dll文件,我的文件生成在D:\My Documents\Visual Studio 2005\Projects目录下// HelloJNIImpl.cpp -- 自己编写的实现文件
// 2007-4-5 16:52:53
#include <jni.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstdio>
#include <windows.h>
#include "HelloJNI.h"
extern "C" {
//
}
using namespace std;
JNIEXPORT void JNICALL Java_HelloJNI_displayHello ( JNIEnv * env, jobject obj ) {
cout << "Hello, JNI tech. This is from C++!" << endl;
}
JNIEXPORT void JNICALL Java_HelloJNI_showTime ( JNIEnv * env, jobject obj ) {
time_t sec;
tm t;
time_t loop;
cout << "时间:" ;
sec = time ( NULL ) ;
t = *localtime ( &sec ) ;
unsigned int hour = t.tm_hour;
unsigned int mini = t.tm_min;
unsigned int secd = t.tm_sec;
if ( hour < 10 ) {
cout << "0" << hour;
}
else {
cout << hour;
}
cout << ":" ;
if ( mini < 10 ) {
cout << "0" << mini;
}
else {
cout << mini;
}
cout << ":" ;
if ( secd < 10 ) {
cout << "0" << secd;
}
else {
cout << secd;
}
cout << endl;
}
JNIEXPORT jstring JNICALL Java_HelloJNI_getLine ( JNIEnv * env, jobject obj, jstring prompt ) {
char buf [ 128 ] = { 0 } ;
const char * str = ( env ) ->GetStringUTFChars ( prompt, 0 ) ;
// printf("%s", str);
cout << str;
( env ) ->ReleaseStringUTFChars ( prompt, str ) ;
string buffer;
getline ( cin, buffer ) ;
// scanf("%s", buf);
return ( env ) ->NewStringUTF ( buffer.c_str ()) ;
} 最后运行java HelloJNI就OK了最后给你个参考的百度知道,其实这方面搜一下很多的,你多搜搜就清楚了
http://baike.baidu.com/view/1272329.htm
C/C++里的方法名字是Java_ + HelloJNI(ClassName) + _getLine(methodName)
如果JAVA中的方法声明中没有参数,C/C++里默认参数是这两个( JNIEnv * env, jobject obj),env从字面上看代表环境指针,obj如果方法是静态方法,那么obj参数代表类,否则代表类的实例
如果有的话就在加在后面,类型怎么对应的你还是看一看规范吧
我记得的就只有这么多了,前两天我想了解一下JNI,搜了一下例子,调通了,然后就没再深入看了,
o(︶︿︶)o 唉,搞这东西,又得回去捡C/C++了,呵呵