大家能否详细说明一下。

解决方案 »

  1.   

    关注一下,
      但一般native方法都是调用本调文件中的方法,如DLL中的方法,
      好像这类方法有个规范什么的,
      我也想详细知道一下,等答案....
      

  2.   

    这个问题看不太懂,方法不就是你自己写的么?想简单就写些简单的语句。jni技术本身不难,google下就知道了。java的编写主要是装入库文件,然后按jni的规则写好方法原型;native的方法要定义在dll或者so文件中,然后把动态链接文件,java文件放在一个目录下。
      

  3.   

    给你个例子,记得是从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
      

  4.   

    是不是c/c++里边的方法头要与java的native定义的方法头是一致的?
      

  5.   

    好像是用javah工具可以生成.h文件头的呀
      

  6.   

    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++了,呵呵