二、Android NDK编程预备之Java jni入门Hello World
转自: 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 __cplusplusextern "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 JNICALLJava_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的更多相关文章
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- 一、Android NDK编程预备之Java jni简介
转自: http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖 论坛›eoe·Android应用开发区›Androi ...
- Android NDK开发之从Java与C互调中详解JNI使用(一)
生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- Android NDK 学习之接受Java传入Object数组
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android NDK开发篇:Java与原生代码通信(数据操作)
虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...
- Android NDK编程,引入第三方.so库
android自带的编译工具NDK进行编译时(非单纯的调用第三方.so而是进行ndk编程),armeabi以及armeabi-v7a文件夹下的第三方so文件将会被删除,只会产生编译后的so文件,其他的 ...
- Android ndk第一步,构建jni headers
转载请注明出处:http://www.cnblogs.com/fpzeng/p/4281801.html 源码请见 https://github.com/fpzeng/HelloJNI PC系统: u ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
随机推荐
- hdu 5427 A problem of sorting
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5427 A problem of sorting Description There are many ...
- Android之Activity的四种启动模式
当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中.Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activ ...
- 二、secureCRT的 使用过程
准备工作: win7与linux能互相ping通 linux安装了ssh被登陆服务 关闭window 防火墙,,控制面板 下载secureCRT 参考资料:http://zhidao.baidu.co ...
- linux下的clock skew detected
今天在虚拟机上用GCC编译一个程序的时候,出现了下面的错误: make: warning: Clock skew detected. Your build may be incomplete 试了ma ...
- 在Eclipse中怎样写Java注释
java中的注释分为实现注释和文档注释 实现注释就是那些/……../和//……的注释,是注释程序用的,文档注释是/*……./的注释,是用来生成javadoc的.设置方法如下: 1.打开Eclipse的 ...
- Kibana4学习<三>
discover 功能 Discover 标签页用于交互式探索你的数据.你可以访问到匹配得上你选择的索引模式的每个索引的每条记录.你可以提交搜索请求,过滤搜索结果,然后查看文档数据.你还可以看到匹配搜 ...
- 【环境】openSUSE安装记录 - 古董本上的windows 7和opensuse双系统
昨天和朋友交流,提到Linux,他说可以去接触SUSE.我马上打开浏览器搜索了一下,发现SUSE是一个Linux操作系统的企业服务器的发行版,是收费的.朋友说,许多公司都用这个,他曾经给公司安装过SU ...
- MySQL基本概念
MySQL 数据库 MySQL可分为三个层次:文件层次,服务层次,界面 常用的数据类型:int 整数float double decimal ——小数(要在十进位栏里设置小数点后最大显示位数)varc ...
- SQL Server 动态管理视图(DMVs)
DMV在本地部署的SQL Server中需要VIEW SERVER STATE的权限 和事务有关的DMV sys.dm_tran_active_transactions:返回与您的当前逻辑数据库的 ...
- codeforces399D
题目大意:ainta刷一面n*n的二维墙.墙一开始可能有一些块被刷了.他终止刷墙的前提是墙的每一行每一列都至少有一块被刷.他每一次从n*n的墙随机选择一块,如果这一块没有被刷就刷,刷了就无视,刷墙不计 ...