转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695

昨天已经简要介绍了JNI,今天用代码来实现JNI的实现过程,并同各们交流各自心得,有不当之处还请客气地批评
       实现过程主要是以昨天介绍的从Java调用C/C++的六个步骤
            1. 编写java代码(Hello World)
       在Eclipse中新建项目Hello World,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
package com.jackie.jni;
 
public class HelloWorld {
        public native void displayHelloWorld();
 
        static {
                System.loadLibrary("HelloWorld");
        }
 
        public static void main(String[] args) {
                new HelloWorld().displayHelloWorld();
        }
}

注意:displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为要用c/c++语言实现它。注意System.loadLibrary("HelloWorld")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是在后面生成的HelloWorld.dll(如果在其他的操作系统可能是其他的形式,比如在Linux中是HelloWorld.so)
          2.编译Java代码:
       这一步Eclipse或其它IDE已帮我们做了,自己编译的形式是:javac 包名.HelloWorld.java,所以我的项目手动编译应为:javac com.jackie.jni.HelloWorld.java 生成相应包下的HelloWorld.class文件
          3.创建C/C++的.h文件头
       这一步中要使用javah命令生成.h文件,其使用方法如下:
                    javah <包含以native关键字声明的方法的 包名.Java类名称>
      本项目的方法是在dos窗口切换至项目主目录输入:javah -classpath bin com.jackie.jni.HelloWorld。在项目主目录下生成了com_jackie_jni_HelloWorld.h文件内容如下:

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jackie_jni_HelloWorld */
 
#ifndef _Included_com_jackie_jni_HelloWorld
#define _Included_com_jackie_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jackie_jni_HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_jackie_jni_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

在此对这个.h文件作个简要的说明:每一个native声明的方法都有一个Java_类名_包名(其中的"."以"_"替换)_方法名与这对应
            4.编写C/C++代码
       在这部分要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorld.cpp文件,内容如下

代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
#include <jni.h>
#include "com_jackie_jni_HelloWorld.h"
#include <stdio.h>
 
JNIEXPORT void JNICALL
Java_com_jackie_jni_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello world!\n");
    return;
}

5.创建共享库文件
       这个VC++也以帮我们做了,注意我们这里include了 jni.h和刚才得到的"com_jackie_jni_HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成HelloWorld.dll文件。
          6.运行Java程序
       把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和HelloWorld.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world!的输出了。(HelloWorld.class和HelloWorld.dll文件必须在同一包目录下面)

一、Android NDK编程预备之Java jni简介:http://www.eoeandroid.com/thread-264384-1-1.html
三、Android NDK编程预备之Java jni入门创建C/C++共享库: http://www.eoeandroid.com/thread-264971-1-1.html

二、Android NDK编程预备之Java jni入门Hello World的更多相关文章

  1. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  2. 一、Android NDK编程预备之Java jni简介

    转自:  http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖     论坛›eoe·Android应用开发区›Androi ...

  3. Android NDK开发之从Java与C互调中详解JNI使用(一)

    生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...

  4. (转)Android: NDK编程入门笔记

    转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...

  5. Android NDK 学习之接受Java传入Object数组

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  6. Android NDK开发篇:Java与原生代码通信(数据操作)

    虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...

  7. Android NDK编程,引入第三方.so库

    android自带的编译工具NDK进行编译时(非单纯的调用第三方.so而是进行ndk编程),armeabi以及armeabi-v7a文件夹下的第三方so文件将会被删除,只会产生编译后的so文件,其他的 ...

  8. Android ndk第一步,构建jni headers

    转载请注明出处:http://www.cnblogs.com/fpzeng/p/4281801.html 源码请见 https://github.com/fpzeng/HelloJNI PC系统: u ...

  9. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

随机推荐

  1. MVC4.0网站发布和部署到IIS7.0上的方法【转:http://www.th7.cn/Program/net/201403/183756.shtml】

    最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不 ...

  2. SQL开发技巧(二) 【转】感觉他写的很好

    本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...

  3. json转换对象

    JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串

  4. 4 我们的第一个c#程序

    1.       控制台应用程序. 在我们这个培训中主要使用控制台应用程序来讲解知识点和做练习. 什么是控制台程序? 控制台程序运行在dos窗口.没有可视化的界面.可以通过Dos窗口进入输入和输出显示 ...

  5. Qt的进度条设置

    progress bar 颜色设置 QProgressBar {   border: 2px solid grey;   border-radius: 5px;   background-color: ...

  6. Daily Scrum7

    今天我们小组开会内容分为以下部分: part 1: 研讨上一届的项目里积分制度的功能,确定其不足,以及我们可以改进的地方: part 2: 讨论确定我们项目的积分制度的功能目标: part 3:针对用 ...

  7. 30道四则运算题目---课堂作业--软件工程c++

    问题:设计一程序,给二年级小学生随机产生四则运算题目. 一.设计思考问题: 1.四则运算需要俩个运算数和一个运算符. 2.如何产生随机数? 3.如何实现随机产生四则运算? 4.题目是否符合小学生学习范 ...

  8. 程序开发心理学阅读笔记——第I篇

    1.软件的任务是为了解决某一特定的问题,而软件开发者的任务却需要解决一系列问题.2.温伯格说,我们不能要求每个人都聪明异常,能够解决所有难题:但是我们必须持续思考,因为只有如此,我们才能明白自己在做什 ...

  9. 或许你不知道:ArrayList

    ArrayList 底层以一个transient 线性数组来存储数据,它提供了无参构造方法,和有参构造方法,用户可以通过有参构造方法来初始化长度.如果不传参数,则默认调用无参构造器,数组默认长度为10 ...

  10. RobotFramework-登录

    *** Settings *** Library Selenium2Library *** Test Cases *** login [Setup] open browser http://XXX/X ...