接下来几篇文章,学习JNI开发,主要是学习《JNI详解》,将里面的实例通过Android平台实现,首先由一个经典实例引出 – HelloWorld!!HelloWorld是经典的,一想起学编程,就想起那些年我们一起写过的HelloWorld。这里用HelloWorld来讲解JNI的开发过程。这个过程大致可通过下图来说明:
1) 新建一个HelloWorld工程;
2) 创建一个带有native方法的类Helloworld.java;
package org.winplus.helloworld;
public class HelloWorld {
public native void print();
private void stitic() {
System.loadLibrary("helloworld");
}
}
HelloWorld类首先声明了一个publicnativevoid print()方法。Static包含的是本地库。在java代码中声明为native的本地方法只作为声明存在。在调用本地方法之前,必须先装载含有该方法的本地库,如HelloWorld中所示,置于static中,在JavaVM初始化一个类时,首先会执行这段代码,这可保证调用本地方法之前装载了本地库。转载的机制请看后文…
3) 使用javac编译Helloworld.java
使用Eclipse的同学不需要做此动作,都自动编译了。进入Class目录。
4) 使用javah –jni 编译Helloworld.class 生成头文件 Helloworld.h;Javah –jni org.winplus.helloworld.HelloWorld会生成一个名为:org_winplus_helloworld_ HelloWorld.h的头文件。生成的代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_winplus_helloworld_HelloWorld */
#ifndef _Included_org_winplus_helloworld_HelloWorld
#define _Included_org_winplus_helloworld_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_winplus_helloworld_HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_winplus_helloworld_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
我们注意到JNIEXPORTvoid JNICALL Java_org_winplus_helloworld_HelloWorld_print(JNIEnv *,jobject);这里我们注意到JNIEXPORT和JNICALL两个宏,我们看到这个函数声明接收两个参数而对应的Java代码中并没有参数。第一个参数是指向JNIEnv结构的指针;第二个参数,为HelloWorld对象自身,即this指针。
5) 使用C实现头文件中的函数
#include <jni.h>
#include <stdio.h>
#include "android/log.h"
#include "HelloWorld.h"
static const char *TAG="HelloWorld";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
JNIEXPORT void JNICALL Java_org_winplus_helloworld_HelloWorld_print
(JNIEnv *env, jobject obj){
LOGI("Hello World");
return;
}
这里为了方便看到打印信息,使用了jni中的log.h头文件和ANDROID_LOG_INFO宏。
6) 编译C文件生成本地库。这一步比较繁琐,请下载源码看吧。具体步骤
a)将头文件及C文件拷贝到jni目录,并编写Android.mk和Application.mk文件
b)通过ndk或者在Ubuntu下编译,生成helloworld.so文件
c)将生成的文件拷贝到libs/armeabi目录下,并更改名字为:libhelloworld.so
7) 运行程序,查看结果。
源码下载==》
分享到:
相关推荐
博客:浅谈MVP实现Android应用层开发 博客文章链接---------实例代码工程 博客:EventBus使用之基础 博客文章链接---------实例代码工程 博客:Android应用Design Support Library完全使用实例 博客文章链接--------...
《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言 第一部分 准备篇 第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 ...
C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为值得一提的是,它还以迭代的方式重现了各种...
第10章 Android应用开发实例 10.1 情境模式 10.2 文件管理器 10.3 通讯录 10.4 音乐播放器 10.5 天气预报 10.6 个人地图 10.7 Widget日历 10.8 小结 第11 章Android游戏开发实例 11.1 手机...
基于老罗的《Android内核源代码情景分析》第二章freg实例,使用NDK编译jni层从而调用驱动程序,能大大缩短项目开发周期。
� 由于采用了 Java 作为应用开发语言,目前可用的传统第三方应用还很少,但由于 Android 是一款完全 开 源的移动计算平台,相信第三方应用会很快的丰富起来。 � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的...
7 Android的Audio系统 7.1 Audio系统的综述 Audio系统架构和代码路径 7.2 meida库中Audio相关接口 Audio系统的本地核心接口,类的层次结构 7.3 Audio系统和上层接口 Audio系统的JAVA层次的接口 7.4 Audio...
分步骤描述了android jni如实开发。
一个JNI入门的使用实例 android 的应用程序(Dalvik VM)中使用JNI(Java Native Interface)调用C/C++开发的共享库
演示JNI中几种不同的调用方法 1. 在应用的JAVA代码中调用NDK中C/C++实现的函数...3. 在NDK开发中的C/C++代码调用应用中JAVA类当前传入NDK中的实例的函数。 4. 在NDK开发中的C/C++代码调用应用中JAVA类新建实例的函数。
1.2.2 Android应用开发 8 1.2.3 Android系统开发 9 1.3 Android的SDK与源代码 10 1.3.1 基于SDK的Android开发 10 1.3.2 基于源代码SDK Android开发 11 第2章 Android系统开发综述 13 2.1 Android的...
目录: 结构如下,非常详细 第1章 android系统概述 1 1.1 基础知识 1 1.1.1 android开发系统的...15.2 android应用开发实例 381 15.2.1 gui依赖类的程序 382 15.2.2 单独模块类程序 387 15.3 android的设计理念 393
部分,Android的连接部分,Android的传感器系统,Android应用开发揭秘(含代码),Android 电话与短信应用,Android斗地主[牌 桌实现源码],Android核心分析,Android开发权威指南. Android开发指南中文版-应用程序框架,...
部分,Android的连接部分,Android的传感器系统,Android应用开发揭秘(含代码),Android 电话与短信应用,Android斗地主[牌 桌实现源码],Android核心分析,Android开发权威指南. Android开发指南中文版-应用程序框架,...
在每一章中,重点介绍了与Android驱动开发相关的底层知识,并对Android源码进行了剖析。 本书适合Android研发人员及Android爱好者学习,也可以作为相关培训学校和大专院校相关专业的教学用书。 全书压缩打包成3...
本书适合有一定基础的android应用开发工程师和系统工程师阅读。通过对本书的学习,大家将能更深刻地理解android系统,从而自如应对实际开发中遇到的难题。 作译者 邓凡平,资深Android开发工程师,热衷于...
针对性强,注重实际应用开发需求,书中所涵盖的知识点都是Android应用开发者和系统开发者需要重点掌握的。 目录 第1章 阅读前的准备工作 / 1 1.1 系统架构 / 2 1.1.1 Android系统架构 / 2 1.1.2 本书的架构 / 3...