Aimd's Blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::
不要幻想一切都那么完美,使用jni调C++功能,也要之前用java声明出预调用的函数,然后用javah和生成的class文件生成一个.h文件,我们做的是针对这个.h文件,实现.cpp。

1:写一个Java类,在这个类中包含了需要调用的本地方法的描述。
public class Main {
    
static
        System.loadLibrary(
"TestDLL"); 
    }
    
    
public native int get();
    
    
    
public static void main(String[] args) {
        Main m 
= new Main();
        System.out.println(m.get);
    }
}

2:编译,然后命令行下使用命令javah -jni (-classpath . )Main,此时会在当前目录下产生一个Main.h文件
3:使用VC来编写本地方法的实现函数,最后编译成.dll文件。过程如下: 
        1) 选择new->projects(选择Win32 Dynamic-Link Library)->OK->An ampty DLL project->Finish。 
        2) 选择Tools->Options->Directories(添加目录..\J2SDK\INCLUDE和..\J2SDK\INCLUDE\WIN32)。
        3) 将Main.h添加到工程。 
        4) 添加源文件Main.cpp,内容如下:
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_get(JNIEnv 
*, jobject)
{
   
return 1;
}

        5) 编译生成TestDLL.dll文件。并将这个.dll文件拷贝到java工程的目录中。
4:运行java工程就可以了。

问题:dll中如果使用了dynamic_cast,就必须把工程的rtti打开,而且dll编译为debug版本,因为rtti要记录每个类的一些信息。否则不能使用这个dll。

注意: 整个过程要保证jdk的版本统一,如vc环境下和javah部分。
posted on 2006-08-18 11:03  Aimd  阅读(4390)  评论(2编辑  收藏  举报