免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 949 | 回复: 0
打印 上一主题 下一主题

JNI入门一_HelloWorld [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-28 21:40 |只看该作者 |倒序浏览
    JNI入门的东西网上已经很多了,转来转去也没多大意思,简单地写一下自己理解的方法,另外主要是说一些自己遇到的情况。
  
    所谓JNI就是java和本地其它平台语言的一个接口规范,我用的是c++。调用分为两种,第一种是本地语言实现java定义的方法并
返回数值,第二种是本地语言方法中引用java定义的数据以及方法,如果包括访问java定义的class数组,异常等东西就显得有些麻
烦了。
    不过我为了简化工作只使用了最简单的第一种方式,分为以下三个白痴步骤:
    1.写java部分,定义方法,此步骤的文件自然是*.java,编译(两种方法:javac命令行,jBuilder等编程工具),生成的文件是*.class
    2.javah把*.class编译生成*.h文件,*.h中包含了要在c中实现的函数的名称以及参数格式。这种文件是符合c语言的头文件
    3.c++建立dll工程文件,并添加自己的.h文件和.cpp文件,把*.h中的要实现的函数拷贝过来,在c中实现即可以,编译生成的dll给java用就大功告成了,c的源代码就可以扔掉了……

    来玩最简单的helloworld吧,唉,基于我的所有程序新装的以及根本不会编程,还是折腾了我一个上午,三个步骤……
    以下实现的平台:JBuildx(jdk1.4.2_04),VS.net2003,winXP(sp2),其它系统或平台有错误概不负责-_-
    1.我是用jBuilderX先建立工程文件,然后添加一个类,直接在jBuildX下面,HelloWorld.java右键点击Make,很顺利地编译,当然可以用javac命令行,加一些参数编译,没有试。
    只要注意两点就行了static{}里面写loadLibrary,load的就是将来的dll文件的名字,文件名字不用写成hello.dll,只要hello就可以,系统会自己判断。另外可以写多个的loadLibrary
    所要实现的方法加上native关键字,表示用JNI实现。
class HelloWorld {
  public native void displayHelloWorld();
  static
  {
    System.loadLibrary("hello");
  }
  public static void main(String[] args){
    new HelloWorld().displayHelloWorld();
  }
}
    2.javah命令行编译的时候找不到指定程序,自然是环境变量设置的问题。第一步用的jBuilderX编译,如果用javac编译照样会出现找不到程序的错误。
    我修改的方法,打开我的电脑,属性,高级,环境变量
           用户变量中新建
           PATH    C:\JBuilderX\jdk1.4\bin
           CLASSPATH C:\JBuilderX\jdk1.4\lib
           系统变量新建
           CLASSPATH C:\JBuilderX\jdk1.4\lib
           系统变量修改
           PATH    增加PATH   ;C:\JBuilderX\jdk1.4\bin
    然后确定就可以,不用重启电脑
    搞定之后比较弱智的方法,进入到helloworld.class的目录下直接javah helloworld就产生helloworld.h,具体内容不说了,里面JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);就是要native实现的函数,如果有package的话,应该就是JNIEXPORT void JNICALL Java_MyPackage_HelloWorld_displayHelloWorld (JNIEnv *, jobject);
    3.建立一个空的dll工程,名称hello(最好选空,那些自动生成的文件没啥用),然后添加一个hello.cpp文件,把helloworld.h拷贝到c的工程目录下。include的时候要包含两项jni.h,HelloWorld.h。
    这里要设置c中的项目路径,即包含java中与JNI相关的头文件,VS.net2003的设置在工具->选项->项目->VC++目录,把java所在的include目录添加进去就可以了。
    不过我这么做了之后仍然告知我找不到jni.h和jni_md.h,后来按照网上的方法,直接把这两个.h文件拷贝到Microsoft Visual Studio .NET 2003\Vc7\include目录下面终于没问题了,其中这两个.h分别位于jdk1.4\include和jdk1.4\include\win32目录下面。
#include
#include"HelloWorld.h"
#include
using namespace std;
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    cout


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22516/showart_161675.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP