下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。

  1. 编写java代码
    我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
    class HelloWorld
    {
        public native void displayHelloWorld();
        static {
            System.loadLibrary("hello");
        }
       
        public static void main(String[] args) {
            new HelloWorld().displayHelloWorld();
        }
    }

    意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因
    为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载
    hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)
  2. 编译java代码
    javac HelloWorld.java  生成HelloWorld.class文件
  3. 创建.h文件
    这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
    javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
    在此我们不对他进行太多的解释。
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */
    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    displayHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
      (JNIEnv *, jobject);
    #ifdef __cplusplus
    }
    #endif
    #endif
  4. 编写本地实现代码
    在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
    #include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>

    JNIEXPORT void JNICALL
    Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
    {
        printf("Hello world!/n");
        return;
    }
    注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。

  5. 运行java程序
    把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|
    的输出了。

JNI是一门复杂,有趣且富有挑战性的技术,我们在后面的几篇文章中将说明如何在java语言和Native语言之间进行交互。

引于-----mingjava

最新文章

  1. 个人作业week3——代码复审
  2. C#可用的日出日落时间类
  3. 调试WEB APP多设备浏览器
  4. github中non-fast-forward错误的解决
  5. HBase的完全分布式的搭建与部署,以及多master
  6. Objective-C:@class和#import
  7. JAVA SERVLET专题(上)
  8. 利用Web服务器网络打洞
  9. Hibernate的配置文件解析
  10. C# 获取属性字段上DescriptionAttribute的值
  11. Codeforces 374A - Inna and Pink Pony
  12. Swift - 文件,文件夹操作大全
  13. [SinGuLaRiTy] NOIP模拟题 by liu_runda
  14. rsync @ERROR: auth failed on module backup 解决思路及附录rsync常见问题及解决办法
  15. 【Java】-NO.14.Java.4.Java.1.001-【Java JUnit 5 】-
  16. 那些年,我们追过的PHP自加自减运算(2)
  17. python的面向对象-实例(对象)的相关知识、实例化
  18. mongodb导出数据表命令之mongoexport
  19. android开发(44) 使用了 SoundPool 播放提示音
  20. Java Future 和 FutureTask 源码Demo

热门文章

  1. poj 3621 0/1分数规划求最优比率生成环
  2. CSS中的文本属性
  3. springmvc的一个小例子学习(一)
  4. 熔断器设计模式&lt;转&gt;
  5. 放弃SCOPE_Identity,使用OUTPUT代替
  6. 关于windows的svchost进程的问题(年代有点久远)
  7. 安装包安装服务,点修复出现的错误”Error 1001:指定的服务已存在“ 解决办法
  8. UI4_UIWebView
  9. JS字符串截取
  10. 遇见NodeJS:JavaScript的贵人