http://java.sun.com/docs/books/tutorial/native1.1/

解决方案 »

  1.   

    http://java.sun.com/docs/books/tutorial/native1.1/index.html有关于jni的介绍。
      

  2.   

    当然你首先应该先编写java程序,然后在用javah生成h文件,最后才编写dll
    遇到这个问题,有几个办法,你选择一下:
    1.在java参数中用数组进行传递,传到dll中一个数组名,dll可以在数组中赋值,java可以得到数组中的返回值(object类型也可以)
    2.返回值采用字符串数组也可以
    我用的是第一种,不知道各位还有什么更好的办法,希望对你有帮助
      

  3.   

    没有看到有关我要的信息
    我已经有了个DLL,没有源码。我如何用JNI
      

  4.   

    JAVA不课能调用VC编写的系统DLL,一定要自己作。
    可能有工具转换,我就不知道了!
      

  5.   

    先声明你想在java中使用的本地方法,用JNI的方式把你想使用的方法生成框架代码来,再在框架代码的实现上用现在已经有的VC 作成的DLL中的函数调用来实现,这叫做Wrapper(Adapter)。可去参考一下《设计模式》书中的介绍。
      

  6.   

    有道理,我在写个新的DLL试试,
    谢谢,可是函数指针如何传递?我要在JAVA中写一段程序由DLL调用阿?
      

  7.   

    把java中的程序作为dll中的callback函数指针?我想现阶段没有方法实现,因为callback这个东西与平台太相关了,无法直接被号称平台无关的java支持吧。
    各位高手有知道的吗?
      

  8.   

    Java Native API Demo
    本文档使用一个简单例子演示一下如何使用Java Native API。
    程序的功能:用户输入直角三角形的两个直角边,程序输出斜边的长度。
    步骤:
    1:编写Java类:
    类名:NativeTest.java
    class NativeTest
    {
    public static void main(String [] args)
    {
    NativeTest aTest=new NativeTest();
    int i0=Integer.valueOf(args[0]).intValue();
    int i1=Integer.valueOf(args[1]).intValue();
    double d=aTest.nativeHypotenuse(i0,i1);
    System.out.println("the value for the  Hypotenuse for a triangle of sides "+args[0]+" and "+args[1]+ " is "+d);
    }
    public native double nativeHypotenuse(int i,int j);
    static 
    {
    System.loadLibrary("NativeTest");
    }
    }
    说明:
    1、 在该Java类的main函数中,首先生成该类的一个实例,然后接受两个参数做为直角三角形的两个直角边,然后调用一个Native方法:nativeHypotenuse,计算直角三角形的斜边。该方法使用C语言实现。
    2、 调用Native方法nativeHypotenuse的方式同调用Java类的其他方法完全相同。如:
    double d=aTest.nativeHypotenuse(i0,i1);
    3、 在Java的类文件中,首先要声明一个Native方法,方式如下:
    public native double nativeHypotenuse(int i,int j);
    在该方法中不包含任何代码(具体代码在C语言中实现,并且作为DLL提供),并且在方法的声明之后紧跟一个分号。
    4、 为了确保Java虚拟机在首次使用该类的时候将DLL装载到内存,需要在包含这个Native方法的类中使用静态初始化程序块。本例中为:
    static 
    {
    System.loadLibrary("NativeTest");
    }
    其中NativeTest为DLL文件的名字
    2:使用javah
    在DOS窗口中运行:
    javah –jni  NativeTest
    运行上述命令之后,在当前目录中生成一个C语言的头文件:
    NativeTest.h。
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class NativeTest */#ifndef _Included_NativeTest
    #define _Included_NativeTest
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     NativeTest
     * Method:    nativeHypotenuse
     * Signature: (II)D
     */
    JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse
      (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus
    }
    #endif
    #endif
    在该文件中,javah程序会生成一个函数声明:JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse(JNIEnv *, jobject, jint, jint);
    3:在当前目录中,创建一个文本文件:NativeTest.c,在该文件中,首先要引用全面由javah产生的头文件:
    #include "NativeTest.h"
    然后将上面的函数声明拷贝到该文件中。之后就可以根据自己的目的实现该函数。
    在本例中,因为要使用C函数库中的方法,所以要包含头文件<math.h>。具体代码如下:
    NativeTest.c
    #include "NativeTest.h"
    #include <math.h>
    JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse(JNIEnv *env, jobject obj, jint i, jint j)
    {
    return sqrt(i*i + j*j);
    }
    3、编译动态连接库
    1、 要想编译成动态连接库,首先要安装VC++和JDK。
    2、 假设 JDK安装在系统的D:\jdk117\目录下。
    3、 在DOS窗口中运行:
    D:\Jdk117\demo\native\test>cl -Id:\jdk117\include -Id:\jdk117\include\win32 –LD    NativeTest.c      -FeNativeTest.dll
    其中CL为VC++的编译程序。程序运行后,在当前目录中生成动态连接库NativeTest.dll
    4、编译并运行
    在DOS窗口中运行:
    javac NativeTest.java
    java NativeTest 3    4
    可以得到输出结果:
    the value for the  Hypotenuse for a triangle of sides 3 and 4 is 5.0
      

  9.   

    www.bestdown.com有一本关于jni的电子书
      

  10.   

    我也想知道,不过确实没找到方法,是否jni真的实现不了回调函数的传递呢?