初学jni,能不能给我一个简单例子源码?
[email protected]

解决方案 »

  1.   

    System.loadLibrary("X");suppose you have a DLL X.dll
      

  2.   

    我以前调过VB和V的DLL,去下面这个帖子看一下,对你有帮助。
    http://search.csdn.net/expert/topic/54/5401/2002/10/29/1132674.htm
      

  3.   

    http://expert.csdn.net/Expert/topic/1910/1910338.xml?temp=.2332117
      

  4.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=24852
    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=160042
      

  5.   

    jacob中的那些方法的文档在什么地方可以找到?例如:
    ActiveXComponent app = new ActiveXComponent("Word.Application");//启动word
    对象名Word.Application怎么知道的?
    另外,象对象中的属性和方法有哪些,具体参数是什么?怎么获得?
    app.getProperty("Documents").toDispatch();
    Variant f = new Variant(false);
    Dispatch.call(doc, "Close", f);
    希望能帮帮我,非常感谢!
      

  6.   

    这是例一:
    调用固有方法
    我们先从一个简单的例子开始:一个Java程序调用固有方法,后者再调用Win32的API函数MessageBox(),显示出一个图形化的文本框。这个例子稍后也会与J/Direct一志使用。若您的平台不是Win32,只需将包含了下述内容的C头:
    #include <windows.h>
    替换成:
    #include <stdio.h>
    并将对MessageBox()的调用换成调用printf()即可。
    第一步是写出对固有方法及它的自变量进行声明的Java代码:
    class ShowMsgBox {
      public static void main(String [] args) {
        ShowMsgBox app = new ShowMsgBox();
        app.ShowMessage("Generated with JNI");
      }
      private native void ShowMessage(String msg);
      static {
        System.loadLibrary("MsgImpl");
      }
    }在固有方法声明的后面,跟随有一个static代码块,它会调用System.loadLibrary()(可在任何时候调用它,但这样做更恰当)System.loadLibrary()将一个DLL载入内存,并建立同它的链接。DLL必须位于您的系统路径,或者在包含了Java类文件的目录中。根据具体的平台,JVM会自动添加适当的文件扩展名。
    C头文件生成器:javah
    现在编译您的Java源文件,并对编译出来的.class文件运行javah。javah是在1.0版里提供的,但由于我们要使用Java 1.1 JNI,所以必须指定-jni参数:
    javah -jni ShowMsgBox
    javah会读入类文件,并为每个固有方法声明在C或C++头文件里生成一个函数原型。下面是输出结果——ShowMsgBox.h源文件(为符合本书的要求,稍微进行了一下修改):/* DO NOT EDIT THIS FILE 
       - it is machine generated */
    #include <jni.h>
    /* Header for class ShowMsgBox */#ifndef _Included_ShowMsgBox
    #define _Included_ShowMsgBox
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     ShowMsgBox
     * Method:    ShowMessage
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL 
    Java_ShowMsgBox_ShowMessage
      (JNIEnv *, jobject, jstring);#ifdef __cplusplus
    }
    #endif
    #endif从“#ifdef_cplusplus”这个预处理引导命令可以看出,该文件既可由C编译器编译,亦可由C++编译器编译。第一个#include命令包括jni.h——一个头文件,作用之一是定义在文件其余部分用到的类型;JNIEXPORT和JNICALL是一些宏,它们进行了适当的扩充,以便与那些不同平台专用的引导命令配合;JNIEnv,jobject以及jstring则是JNI数据类型定义。
      

  7.   

    实现自己的DLL
    此时,我们要做的全部事情就是写一个C或C++源文件,在其中包含由javah生成的头文件;并实现固有方法;然后编译它,生成一个动态链接库。这一部分的工作是与平台有关的,所以我假定读者已经知道如何创建一个DLL。通过调用一个Win32 API,下面的代码实现了固有方法。随后,它会编译和链接到一个名为MsgImpl.dll的文件里:#include <windows.h>
    #include "ShowMsgBox.h"BOOL APIENTRY DllMain(HANDLE hModule, 
      DWORD dwReason, void** lpReserved) {
      return TRUE;
    }JNIEXPORT void JNICALL 
    //续例一
    Java_ShowMsgBox_ShowMessage(JNIEnv * jEnv, 
      jobject this, jstring jMsg) {
      const char * msg;
      msg = (*jEnv)->GetStringUTFChars(jEnv, jMsg,0);
      MessageBox(HWND_DESKTOP, msg, 
        "Thinking in Java: JNI",
        MB_OK | MB_ICONEXCLAMATION);
      (*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);
    }
      

  8.   

    //续例一:
    编码提示:
    1.将所有(*jEnv)->的地方改为jEnv->
    2.将上面的申明:Java_ShowMsgBox_ShowMessage(JNIEnv * jEnv, 
      jobject this, jstring jMsg) 中的"this"改为obj