rt..
写gui...
最好能有个例子.谢谢

解决方案 »

  1.   

    Java Native Interface以下是jni的简单作用:1.  Java库函数不支持的功能(如平台有关的特点)2.  已有用其他语言编写的库函数、应用程序,希望能用java调用3.  效率的考虑(用汇编等) 调用方式:本地代码 java代码之间的相互交互 从java程序调用本地方法    1.在java程序中加入本地方法说明:public native void methodName(){};2.产生本地方法的头文件:javah –jni ClassName3.本地方法的实现与编译:   在c中方法名为:Java_ ClassName _ methodName (JNIEnv *env, jobject obj,***)将头文件和(本地方法)实现文件编译成共享库文件 Java代码部分:n         定义native方法----当程序中的方法实现是采用java以外的语言时,必须以native关键字说明;n         加载共享库----System.loadLibrary(“libname”)方法可以实现共享库的加载,从而完成native方法在声明和实现之间的映射。(在类定义过程中,一般以static前缀来描述这一代码,从而隐式加载共享库,例如:static {  System.loadLibrary(“libname”; )};另外,libname和库文件名的对应关系是平台相关的,如在Solaris中为liblibname.so,而Windows系统中为libname.so )为本地方法创建头文件:n         语法----javah –jni class文件名;n         目的----得出native方法的文件名,见(二。3),注意,比java中的native方法多两参数。本地方法实现:n         在c语言中,本地函数的写法如下:  JNIEXPORT void JNICALL Java_ ClassName _ methodName (JNIEnv *env, jobject obj,***){}n         c语言代码应该包含下述头文件:jni.h及由javah生成的头文件。JNI就是用Java和C,C++语言交互。从Java调用C++来显示一个Hello,JNI!
    -1-写一个简单的Java类:
    JNIHello.java
    -------------------------------------------
    package jni;/**
     * <p>Title: JNIHello</p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * @author Luo
     * Date: 2005-3-31
     * Time: 8:48:11
     */
    public class JNIHello {
        static {
            System.loadLibrary("JNIHello");
        }    public static void main(String args[]) {
            System.out.println(getHello());
            new JNIHello().sayHello();
        }    public static native String getHello();    public native void sayHello();
    }
    -------------------------------------------
    里面两个带native的方法,一个static,一个实例方法;一个返回String,一个void。比较具有代表性了吧 。
    native方法就是告诉虚拟机,这个方法由本地的代码实现。现在在windows下实现,就是dll了。
    -------------------------------------------
    -2-用javah命令 javah jni.HNIHello 生成jni_JNIHello.h。
    jni_JNIHello.h
    -------------------------------------------
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #i nclude "jni.h"
    /* Header for class jni_JNIHello */#ifndef _Included_jni_JNIHello
    #define _Included_jni_JNIHello
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     jni_JNIHello
     * Method:    getHello
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_jni_JNIHello_getHello
      (JNIEnv *, jclass);/*如果觉得还不人意,下面介绍从jbuiler中如何建立(用 JB5 和 VC6.0 IDE 环境做 )
    JNI 的步骤。
    1. 建一个 JB 工程
    2. 选 File->New 或点一下工具栏的 New 图标,选第一页的 Class 类型,选 OK,把类名改为 HelloWorld, 包名随意,这里假设为空,把 Options 里面的五个选项全选上(可以酌情少选),产生一个新的名为 HelloWorld 或 xxx.HelloWorld 的class
    3. 修改一下这个 class,改成这个样子并保存:
    public class HelloWorld {
    public native void helloworld();
    static {
    System.loadLibrary("hello");
    }
    public static void main(String[] args) {
    new HelloWorld().helloworld();
    }
    }
    4. 这时在 project 流览器里可以看到刚刚产生的 HelloWorld.java文件,在这个文件上点鼠标右键,选属性,打开 Build 属性页 把 Generate jni file 叉叉划上,选 OK。
    5. 编译这个 java 文件,这时将会看到在 HelloWorld.java 文件.下面多了一个HelloWorld.h,这是我们将要用到的本地方法的头文件。
    6. 打开 VC,选 Tools->Options->Directries->Show directries for选中 include files。
    把 \include, \include\win32 这两个目录加进去。
    7. 选 File->New,给你的工程取个名字,在 project 页里选 Win32 Dynamic-Link Library,按 OK,选 Empty dll project
    8. 把开始的 HelloWorld.h 加到你的 VC 工程目录里面,并新建一个 HelloWorld.c(可以是你想要的任意 .c 结尾的名字)源文件。
    9. 在 HelloWorld.c 开始加上下面这几行声明:
    #i nclude
    #i nclude "HelloWorld.h"
    #i nclude // 因为下面要用到 printf 语句,所以要这个头文件。
    10. 把 HelloWorld.h 里面方法声明拷贝过来,有多少拷多少,我们这里只有JNIEXPORT void JNICALL Java_HelloWorld_helloworld(JNIEnv *, jobject)
    并加上函数第一个参数和第二个参数的名字,方法体如下:
    JNIEXPORT void JNICALL
    Java_HelloWorld_helloworld(JNIEnv *env, jobject obj){
    printf("Hello");
    }
    11. 在函数里加上任何你想要的 c 代码,按 F7,在工程的 debug 或 release 目录下将生成一个 dll 文件,把该 dll 文件改成 hello.dll (也可在 project->settings->link 里面直接把生成的文件名变成 (你想要的目录)/hello.dll),并把该 dll 放到一个你的path 环境 设置里能找到的目录,一般放在当前目录就可以了。
    12. 运行 java HelloWorld 如果你的 dll 和 class 都已经生成但是出现下面的异常
    java.lang.UnsatisfiedLinkError: no hello in shared library path
    at java.lang.Runtime.loadLibrary(Runtime.java)
    at java.lang.System.loadLibrary(System.java)
    at
    at java.lang.Thread.init(Thread.java)
    是因为你的 dll path 设置不正确,检查你的 java 源文件里这一行: System.loadLibrary("hello");
    loadLibrary 的参数应为你的 dll 文件名,但不包括括展名,
    比如说 你的 dll 文件为abc.dll,则应这样调用 System.loadLibrary("abc");
    而不是 System.loadLibrary("abc.dll");
    本来想写一个 jni in a nutshell 的,结果还是写了这么一大串,看在我打字这么辛苦的份上,不要拿香蕉皮砸我。:)
    leaffall的package提示:
    jni方法需要加native关键字
    public native void myMethod();在javah -jni MyClass产生的.h 文件中会有:
    JNIEXPORT void JNICALL
    Java_MyClass_myMethod(JNIEnv *, jobject);
    如果你的类中有包的定义(package com.leaffall) 请修改为:
    JNIEXPORT void JNICALL
    Java_com_leaffall_MyClass_myMethod(JNIEnv *, jobject);还有一文章不错,可看http://www.51one.net/study/jsp/29595.html
      

  2.   

    我写的一个简单的例子,可以供参考:
    java代码:
        public class MyNative
    {
    static
    {
    System.loadLibrary( "MyNative" ); 
    }
     public native static void HelloWord(); 
     public native static String cToJava();
     public static void main(String[] args)
      {
       MyNative nnative =new MyNative();
       HelloWord();
       cToJava();
      }c++实现代码:
    #include "jni.h"
    #include "MyNative.h"JNIEXPORT void JNICALL Java_MyNative_HelloWord (JNIEnv *env, jclass jobject)
    {
    printf("hello word!\n"); 
    }
    JNIEXPORT jstring JNICALL Java_MyNative_cToJava(JNIEnv *env, jclass obj)
    {
    jstring jstr;
    char str[]="Hello,word!\n";
    jstr=env->NewStringUTF(str);
    return jstr;
    }