惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
云风的 BLOG
云风的 BLOG
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
A
About on SuperTechFans
WordPress大学
WordPress大学
B
Blog
Martin Fowler
Martin Fowler
Jina AI
Jina AI
I
InfoQ
P
Proofpoint News Feed
小众软件
小众软件
S
SegmentFault 最新的问题
V
V2EX
B
Blog RSS Feed
量子位
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
美团技术团队

博客园 - Aimd

EPS图片转换 & 共享一个Excel宏,用于画Latex表格 Latex从零到开始使用 Eclipse下配置及使用Tomcat 6.0数据库连接池连接sqlserver2000 强制删除文件夹 SWT应用程序打包成jar过程 解决firefox频繁询问代理服务器用户名和密码问题 SQL server 2005 不能重新安装解决及ADO连接事例代码 SQL server 2005 远程连接问题及解决 家乡回长春路上拍的照片 blog的三种人 右键打不开磁盘又出新花样 允许SWT Table的Tableitem多行显示 今天遇到一个geotools(GIS)和Eclipse合作的巨恶问题 实现模型间的多线连接 慎用EMF Ecore文件的名字 数据压缩方法 BIRT插件的使用 RCP的布局得两个细节 RCP导出注意事项
用jni实现java使用dll
Aimd · 2006-08-18 · via 博客园 - Aimd

不要幻想一切都那么完美,使用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部分。