JNI--Hello World

JNI概述

JNI 是Java Native Interface的缩写,中文译为“Java本地调用”。通常使用JNI技术可以做到以下两点:

(1)Java程序中的函数可以调用Native语言函数,Native函数一般指的是C/C ++编写的函数;

(2)Native程序中的函数可以调用Java层的函数,也就是说在C/C++程序中可以调用Java层函数。

当然任何事物都有两面性,JNI也不例外,使用JNI主要缺点有以下两点:

(1)使用JNI技术将导致Java Application不能跨平台。如果要移植到别的平台上,那么Native代码就要重新进行编写;

(2)Java是强类型的语言,而C/C++不是,因此在编写JNI的时候要非常谨慎。

JNI--Hello World

我们在学习任何一门语言技术时,首先编写的应该是简单的“ Hello World ”,那么接下来就给大家介绍怎样使用JNI技术来实现Hello World。

(1)首先在Java类中声明一个native的方法

在eclipse中新建一个NativeDemo工程,类名为TestNative,具体代码如下所示:

[java]

package com.jony.nativetest;

public class TestNative {

public native void sayHello();

/**

* @param args

*/ www.2cto.com

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

(2)使用Javah命令生成包含native方法定义的C/C++头文件;

在Java的安装路径(D:\Java\jdk1.6.0_24\bin)中大家可以看到很多可执行文件,其中包含我们常用的java、javac、javah等命令。首先,我们可以简单查看一下javah命令的使用方法,在命令行中输入 javah -help 查看命令参数和使用方法,如图所示:

JNI--Hello World

接下来首先将我们编写的TestNative.java文件编译成class文件,在我本地代码中对应的路径为:E:\Workspaces\android\NativeDemo\bin,具体如图所示:

JNI--Hello World

在命令提示框中输入:cd E:\Workspaces\android\NativeDemo\bin 和 E: 进入到对应的文件目录,如图所示:

JNI--Hello World

最后在命令提示框中输入 javah com.jony.nativetest.TestNative 命令生成.h头文件,如入所示:

JNI--Hello World

执行完以上命令后,在路径E:\Workspaces\android\NativeDemo\bin下就能查看生成的.h头文件。生成代码如下(com_jony_nativetest_TestNative.h):

[cpp]

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_jony_nativetest_TestNative */

#ifndef _Included_com_jony_nativetest_TestNative

#define _Included_com_jony_nativetest_TestNative

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_jony_nativetest_TestNative

* Method: sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_com_jony_nativetest_TestNative_sayHello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

(3)按照生成的C/C++头文件来写C/C++源文件

首先,在VC++编译器中创建一个Win32 Dynamic-Link Library工程,工程名为NativeCode02,将之前生成的头文件(com_jony_nativetest_TestNative.h)拷贝到NativeCode02项目的根目录。

接下来创建source.cpp文件,目录结构如图所示:

JNI--Hello World

C++代码比较简单,具体代码如上图所示。

(4)将C/C++源文件编译成动态链接库(DLL--可执行的二进制代码)

在进行编译(Ctrl + F5)源文件时,出现以下异常:

--------------------Configuration: NativeCode02 - Win32 Debug--------------------

Compiling...

source.cpp

i:\archive_software\c&c++\vc6.0完整绿色版\myprojects\nativecode02\com_jony_nativetest_testnative.h(2) : fatal error C1083: Cannot open include file: 'jni.h': No such file or directory

执行 cl.exe 时出错.

NativeCode02.dll - 1 error(s), 0 warning(s)

该异常表明在编译的时候没有找到jni.h头文件。在Java的JDK中提供了该头文件,因此我们可以Java安装路径(D:\Java\jdk1.6.0_24\include)找到该头文件,将其拷贝到NativeCode01工程的Header Files目录下

(备注:因为jni.h头文件已经拷贝到本地,因此引用的时候应该将<>替换成" ")再次进行编译(Crtl + F5),出现以下异常:

--------------------Configuration: NativeCode02 - Win32 Debug--------------------

Compiling...

source.cpp

i:\archive_software\c&c++\vc6.0完整绿色版\myprojects\nativecode02\jni.h(27) : fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory

执行 cl.exe 时出错.

NativeCode02.dll - 1 error(s), 0 warning(s)

该异常也非常容易理解,缺少jni_md.h头文件,同样在Java的安装路径()中找到该头文件并将其拷贝到Header Files目录下,再次进行编译:

--------------------Configuration: NativeCode02 - Win32 Debug--------------------

Compiling...

source.cpp

Linking...

Creating library Debug/NativeCode02.lib and object Debug/NativeCode02.exp

NativeCode02.dll - 0 error(s), 0 warning(s)

OK,编译成功,在工程项目的Debug目录中可以看到我们编译成功的NativeCode02.dll文件。

(5)将动态链接库路径保存在path路径下,这样在Java代码中就可以直接调用该动态链接库(DLL)

具体步骤省略

(6)编写Java层代码

当动态链接库编译成功后,我们就可以在Java层调用该动态链接库了,代码比较简单,直接上代码:

[java]

package com.jony.nativetest;

public class TestNative {

public native void sayHello();

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

System.loadLibrary("NativeCode02");// 加载动态链接库

TestNative testNative = new TestNative();

testNative.sayHello();//调用naive方法

}

}

OK,大功告成,JNI--Hello World至此已经实现,接下来的博客将给大家深入介绍JNI的使用方式,技术源于分享,大家共同进步……

分类:默认分类 时间:2012-09-13 人气:1
本文关键词:
分享到:

相关文章

  • UVA11636- Hello World! 2012-04-27

    题意:使用最小的复制/黏贴次数,使得语句的条数恰好为n 思路:贪心思想,因为复制是所有条数翻倍,所以每次都取最大的条数*2 PS:天真的认为是n = -1时退出,所以WA了好几次。 #include #include #include #include using namespace std; int main() { int n, t = 1; while (scanf("%d", &n) != EOF) { if (n 点击复制链接 与好友分享!回本站首页 您对本文章有什么意见或着疑

  • Android开发之"hello World"的实现 2013-07-30

    按照惯例,同时也是为了更好地引导读者进入精彩的Android世界,我们接下来要实现一个简单的“hello World”例子。这里以Android SDK 2.1为基础基于Eclipse Galileo(Eclipse 3.5)作为IDE来完成开发。 通过“File”→“New”→“Project”创建Android工程,如图1所示。设置“Project name:”为“helloWorld”,设置“Build Target”为“Android 2.1”,设置“Application name:”

  • Qt on Android:图文详解Hello World全过程 2012-04-09

    这是系列文章中的一篇,阅读本文前请先阅读《Windows下Qt 5.2 for Android开发入门》,以便确保开发环境和作者一致。 部分文章被转发/转载却没有注明出处,特此声明:版权所有 foruok ,如需转载敬请注明出处(http://blog.csdn.net/foruok)。 我将从实践出发,带领大家一步一步完成在 Android 上的第一个 Qt 应用: Hello Qt on Android 。应用本身非常简单(仅仅是在屏幕上显示一个字符串 "Hello Qt on Androi

  • Android应用程序开发 把Hello World显示出来! 2012-07-01

    3G来了!手机成为一个越来越重要的平台,再不看看手机领域是不是就被淘汰了。如今移动,联通,电信三家运营商都有自己的3G网络,分别是TD-CDMA,WCDMA,CDMA2000,撇开网络不说,直接与写应用程序相关的就是手机的操作系统了。如今智能手机系统主要有Window Mobile,Nokia symbian, Mac iphone等,而Google则最近推出自己开源免费的手机操作系统Android。相信凭着免费开源和Google的牌子,今后的发展也会很不错的。 今天想了解一下Android,就

  • 我的Android笔记(一)-- hello world程序结构分析 2012-09-03

    新建一个android project,(我用的是2.3.3的Target),eclipse会自动生成以下内容—— ——这是一个完整的可运行的“hello world”程序。 运行结果为: 在屏幕上显示出了Hello world,Demo_01Activity! 然后就开始分析以下这个程序吧—— 在AndroidManifest.xml中有如下代码段: [html] <activity android:label="@string/app_name" android:name=".Demo

  • AAuto快手初次启动了解hello world 2012-09-11

      第一次启动快手,会弹出创建工程的向导,   你也可以点击“快手主菜单 -> 新建工程 -> 对话框应用程序” 打开创建工程的对话框。   如下图:   显示的工程向导如下图:   在上图的对话框界面中直接点击创建工程按钮 - 创建一个工程。   在左侧找到【工程管理器】,点击【工程根目录】,   然后点击工程管理器顶部左侧第一个按钮【显示工程属性 】   可在【属性面板】修改工程属性。如下图:   修改属性项以后,鼠标单击其他属性以完成输入。   我们试试把工程名字改为“我的工程

  • android快速上手(二)android开发环境搭建及hello world 2012-09-29

    基本了解了java语法,下一步,我们一起开启hello world的神秘之旅。 (一)android开发环境搭建 之前搭建android开发环境是件非常费力的事情,下载Eclipse,安装ADT等,如今android官方给我们提供了全套配置。 https://developer.android.com/sdk/index.html 搭建android开发环境之前记得先安装jdk (二)开启Hello World之旅 (1)创建Hello World项目 安装完带ADT的Eclipse,打开Ecl

  • IOS开发笔记(1)---Hello World 2012-10-28

    搭建好XCode4.2 为了学习Object C,新建Mac OS项目下的Command Line Tool 选择Type为Foundation 示例是简单的Hello World // // main.m // Hello // // Created by Lei Zhang on 11-10-28. // Copyright (c) 2011年 XJTU. All rights reserved. // #import <Foundation/Foundation.h> int

  • 快速搭建Android开发环境ADT-Bundle及Hello World 2012-11-19

    ----下载JDK(Java Dev Kit) 官方下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 《JDK与JRE的不同以及含义》:http://www.pc6.com/infoview/Article_53547.html 1. JVM - java virtual machine!JVM是我们常说的java虚拟机,它是整个java实现跨平台的最核心部分,所有java程序会首先被编译为.class类文

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.105 (s). 10 q(s)