Android初涉JNI,从零打造你的第一个demo
Android中JNI编程的那些事儿

Android中JNI编程的那些事儿(1)2011-06-08 09:19 佚名互联网字号: |JNI译为Java本地接口。
它允许Java代码和其他语言编写的代码进行交互。
在android中提供JNI的方式,让Java程序可以调用C语言程序。
android中很多Java类都具有native 接口,这些接口由本地实现,然后注册到系统中。
AD:Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Native)代码。
因此JNI对Android底层开发人员非常重要。
如何将.so文件打包到.APK让我们先从最简单的情况开始,假如已有一个JNI实现——libxxx.so文件,那么如何在APK中使用它呢?在我最初写类似程序的时候,我会将libxxx.so文件push到/system/lib/目录下,然后在Java代码中执行System.loadLibrary(xxx),这是个可行的做法,但需要取得/system/lib 目录的写权限(模拟器通过adb remount取得该权限)。
但模拟器重启之后libxxx.so文件会消失。
现在我找到了更好的方法,把.so 文件打包到apk中分发给最终用户,不管是模拟器或者真机,都不再需要system分区的写权限。
实现步骤如下:1、在你的项目根目录下建立libs/armeabi目录;2、将libxxx.so文件copy到 libs/armeabi/下;3、此时ADT插件自动编译输出的.apk文件中已经包括.so文件了;4、安装APK文件,即可直接使用JNI中的方法;我想还需要简单说明一下libxxx.so的命名规则,沿袭Linux传统,lib<something>.so是类库文件名称的格式,但在Java的System.loadLibrary(" something ")方法中指定库名称时,不能包括前缀—— lib,以及后缀——.so。
Android中JNI的使用之一:Java原生JNI的使用、javah指令的使用以及图解教材

Android中JNI的使用之一:Java原生JNI的使用、javah指令的使用以及图解教材Java Nativie Interface(JNI,中文名称Java本地接口)标准时Java平台的一部分,它允许Java代码和其他语言写得代码进行交互。
JNI是本地编程接口,它使得Java虚拟机(VM)内部运行的Java代码能够用其他编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。
JNI的主要用途是为了对硬件进行访问以及追求高效率或可重用C/C++库。
Android系统中采用了JNI的方式来调用C/C++方法,然而,在Android系统里进一步加强了Java JNI的使用,使JNI的调用更具有效率。
因此,总的来说,Android 系统里可以采用两种方式来使用JNI。
第一种:Java原生JNI,使用dll等动态链接库;第二种,Android加强版JNI,通过动态加载*.so链接库来进行JNI调用。
今天,我们分析第一种JNI使用方式,也称得上是JNI入门。
由于Java与其他编程语言采用的语法不同,为了让Java与C/C++库函数能进行通信,约定的一个参数类型映射如下:Java类型C/C++类型void voidjboolean booleanjint intjlong longjdouble doublejfloat floatjbyte jbytejchar charjshort shor上面的只是简单类型的一个映射,后面我们会完善其他参数类型的映射。
开发环境介绍(Windows下):Eclipse:主要用来创建Java工程MicrosoftVC++6.0:生成动态链接库供相应的Java文件加载一、使用Eclipse创建Java工程本例中,我们简单的创建了一个Java工程HelloBabyJNI,工程绝对路径位于E:\MyCode\AndroidCode\HelloBabyJNI路径下,主文件路径位于\src\lover\hellojni路径下(路径对后面的javah编译很重要)HelloBabyJNI.java文件如下:[java] view plaincopyprint?1.package com.lover.hellojni;2.3./**4. * 一个简单的Java JNI实例5. *6. */7.public class HelloBabyJNI {8.9./*10. * 静态构造函数,动态加载HelloBabyJNI动态库,其dll文件名为:HelloBabyJNI.dll --->由MSVC6.0软件创建11. */12.static {13. System.load("E:/HelloBabyJNI.dll"); // 可能需要 dll链接库的绝对存放路径14. }15.16./*17. * 在Java中注册需要调用的C/C++本地方法(native method),也就是需要C/C++来实现的方法18. */19.public native int add(int a, int b);20.21.// main方法,加载动态库来调用C/C++本地方法22.public static void main(String[] args) {23. HelloBabyJNI helloBabyJNI = new HelloBabyJNI();24.// 调用注册的add方法来得到返回值25.int result = helloBabyJNI.add(2, 3);26.// 输出27. System.out.println("after invoke the native method,the result is "+ result);28. }29.}2,编译HelloBabyJNI.java文件,生成HelloBabyJNI.class文件,位于路径\src\lover\hellojni\HelloBabyJNI.class3,使用javah指令编译HelloBabyJNI.class文件,生成Java与C/C++之间进行通信的约定接口,它规定了Java中nativemethod在C/C++的具体接口。
android.mk详解 android NDK从入门到精通

LOCAL_MODULE 是最后生成库时的名字的一部分, 给其加上前缀lib和后缀.so就是生成的共享库的名字 libhello-jni.so。
LOCAL_SRC_FILES 指明要被编译的c文件的文件名 include $(BUILD_SHARED_LIBRARY) 指明NDK编译时将 生成一些共享库,有需要链接其他的库的时候会在 该行下面添加。
2.内容短小精悍
3.实例精讲,都是有实际意义的项目:音频编码
4.提供好的学习经验;
helloJNI 的android.mk
#######################start############ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) ##########################################
Android.mk详解
LOCAL_PATH 是描述所有要编译的C文件所在的根目录,这边的赋值为 $(call my-dir),代表根目录即为Android.mk所在的目录。
LOCAL_PATH通过调用my-dir函数来获取当前的路径,my-dir函数的定义位 于core/definitions.mk文件。这里不需要管太多主要的android.mk文件位置 放对,如果不对话可以通过编译的时候,提供路径参数。 include $(CLEAR_VARS) 代表在使用NDቤተ መጻሕፍቲ ባይዱ编译工具时对编译环境中所用到的 全局变量清零,如LOCAL_MODULE,LOCAL_SRC_FILES等,因为在一次 NDK编译过程中可能会多次调用Android.mk文件,中间用到的全局变量可 能是变化的。
AndroidNDK开发指南

AndroidNDK开发指南Android NDK开发指南第一章:介绍Android NDKAndroid NDK(Native Development Kit)是一个用于开发Android应用程序的工具集。
它提供了一组与平台无关的原生C/C++库以及一组工具,可以帮助开发者在Android应用程序中使用C/C++代码编写高性能的本地代码。
本章将介绍Android NDK的概述,包括其背景、目的以及与传统Java开发的区别。
同时还将介绍使用Android NDK的优势和适用场景。
第二章:Android NDK环境搭建要开始使用Android NDK进行开发,首先需要搭建相应的开发环境。
本章将详细介绍如何在Android Studio中配置NDK开发环境,包括下载和安装NDK工具链、配置Gradle构建文件以及设置NDK路径等。
第三章:Android NDK开发基础在进行Android NDK开发之前,需要了解一些基本概念和核心知识。
本章将介绍如何编写和构建C/C++代码,如何与Java层进行交互,以及如何处理线程和内存管理等重要方面。
第四章:使用Android NDK调用系统API在Android NDK中,可以直接调用系统提供的原生API,以实现更底层的功能。
本章将介绍如何使用Android NDK调用系统API,包括访问传感器、相机、音频、网络等硬件和系统服务。
第五章:优化Android NDK代码性能Android NDK提供了一系列优化工具和技术,可以帮助开发者提升代码性能。
本章将介绍如何使用NDK的调试工具、性能分析工具和优化技术,以及在设计和编写代码时应注意的性能问题。
第六章:使用第三方库进行Android NDK开发Android NDK还支持使用第三方库进行开发,这些库可以提供更多的功能和便利性。
本章将介绍如何集成和使用常见的第三方库,比如OpenCV、FFmpeg、SQLite等,以及相应的配置和调用方法。
安卓系统制作教程

安卓系统制作教程制作安卓系统是一个复杂的过程,需要多方面的知识和技能。
下面是一个简单的安卓系统制作教程,帮助初学者更好地理解它。
第一步:了解安卓系统架构安卓系统是基于Linux内核和Java虚拟机的开放源代码操作系统。
首先要了解安卓系统的架构,包括核心组件,如应用层、系统服务层、应用框架层、库和运行时。
第二步:设置开发环境安卓系统的制作需要特定的环境和工具。
你需要安装JDK并配置好Java环境变量,然后下载和安装Android SDK。
之后,根据你的开发需求,选择合适的集成开发环境,如Android Studio或Eclipse。
第三步:创建Android工程使用Android Studio或Eclipse创建一个新的Android工程。
在项目中,你可以定义应用的名称、包名、主题和其他属性。
第四步:编写代码安卓系统的编写主要是通过编写Java代码和XML布局文件来实现。
你可以通过学习Android的开发文档和教程来熟悉安卓系统的开发方法和技巧。
在这个过程中,你需要掌握Android的基础组件,如活动(Activity)、布局(Layout)、视图(View)、片段(Fragment)等。
第五步:构建和调试完成代码编写后,你需要构建和调试你的安卓系统。
你可以使用Android Studio或Eclipse提供的工具来构建、运行和调试你的应用程序。
第六步:发布和部署当你的安卓系统开发完成后,你可以将其打包并发布到Google Play商店或其他安卓应用商店中。
你需要创建一个开发者账户,并按照商店的要求提交你的应用。
总结:制作安卓系统不仅需要掌握Java编程语言,还需要了解安卓系统的架构、开发环境和工具。
通过学习和实践,你可以逐渐掌握制作安卓系统的技能,创建自己的应用。
这个过程可能会遇到一些困难,但只要你持续学习和努力,你一定能够制作出优秀的安卓系统。
Android应用开发环境搭建教程

Android应用开发环境搭建教程随着智能手机的普及,Android应用开发成为了一个热门的行业。
许多人都希望能够开发自己的Android应用,但是很多人却不知道如何搭建开发环境。
本文将介绍如何搭建一个完整的Android应用开发环境,帮助初学者入门。
一、安装Java开发工具包(JDK)Android应用开发需要使用Java语言,因此首先需要安装Java开发工具包(JDK)。
在官方网站上下载适合你操作系统的JDK安装包,并按照提示进行安装。
安装完成后,可以通过在命令行输入“java -version”来验证是否安装成功。
二、安装Android StudioAndroid Studio是官方推荐的Android应用开发集成开发环境(IDE)。
在官方网站上下载适合你操作系统的Android Studio安装包,并按照提示进行安装。
安装完成后,打开Android Studio,会有一系列的设置向导,按照提示进行设置即可。
三、安装Android SDKAndroid SDK是Android开发所需的软件开发工具包。
在Android Studio中,可以通过SDK Manager来安装和管理Android SDK。
打开Android Studio后,点击菜单栏中的“SDK Manager”按钮,然后选择需要安装的Android SDK版本和组件,并点击“Apply”按钮进行安装。
安装完成后,可以通过在命令行输入“adb devices”来验证是否安装成功。
四、创建Android虚拟设备(AVD)Android虚拟设备(AVD)是Android模拟器,用于在计算机上模拟Android设备的运行环境。
在Android Studio中,可以通过AVD Manager来创建和管理AVD。
打开Android Studio后,点击菜单栏中的“AVD Manager”按钮,然后点击“Create Virtual Device”按钮,选择需要创建的设备类型和系统镜像,并按照提示进行设置。
Android应用开发入门:从零开始构建你的第一个应用
Android应用开发入门:从零开始构建你的第一个应用移动应用开发领域的巨头之一是安卓应用开发。
而在进入这个领域之前,我们需要掌握一些基本的知识。
本篇文章将介绍从零开始构建第一个安卓应用的步骤,并提供一些应用开发的基础知识。
要开始构建安卓应用,首先需要安装并设置好开发环境。
安卓应用开发主要使用Java语言,所以你需要下载并安装Java Development Kit(JDK)。
安装JDK后,你还需要安装Android Studio,这是谷歌官方提供的安卓应用开发工具。
安装完Android Studio后,你就可以开始创建你的第一个安卓应用了。
创建一个新的安卓项目非常简单。
打开Android Studio后,选择“Start a new Android Studio project”选项,然后按照向导的指示进行操作。
你需要选择应用的名称、包名和存储位置等信息。
在创建新项目之前,还需要选择一个适用的设备。
你可以选择一个模拟器或连接一个真实的安卓设备进行开发和测试。
当你完成项目创建后,你将看到一个默认的欢迎界面。
在这个界面上,你可以点击不同的选项来创建新的活动或布局文件。
活动是安卓应用的基本组成单元,它包含用户界面和代码逻辑。
布局文件定义了活动中的控件和布局样式。
要创建一个新的活动,你可以右键点击项目目录,选择“New”和“Activity”选项,然后按照向导的指示填写相应的信息。
一旦你创建了一个活动,你可以在其中添加控件、设置布局和编写代码逻辑。
安卓应用的用户界面主要使用XML来定义。
XML是一种标记语言,用于描述界面元素以及它们的属性和布局。
例如,你可以使用XML来定义一个按钮、一个文本框和一个图片视图。
然后,你可以使用Java 代码来处理这些控件的事件,比如点击按钮时触发某些操作。
此外,你还可以使用一些预定义的Android API来实现更复杂的功能。
Android API是一组开发者可以使用的程序接口,它们允许你访问设备的各种功能,比如相机、传感器和网络。
AndroidAPP开发入门教程
Android APP开发入门教程这篇文章主要介绍了Android APP开发入门教程,从SDK下载、开发环境搭建、代码编写、APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教程,需要的朋友可以参考下;工作中有做过App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣;于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂;一、准备工作主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持;首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长;然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可;填好项目名称后下一步选择USB Device,然后完成项目构建,IDE会自动生成基本的项目所需的文件及目录;二、代码编写做好准备工作后,终于可以开始写我们的hello android了,在开始编写代码之前,我们先了解几个文件:res/layout/main.xml App主窗体布局文件,你的应用长什么样都在这边定义,有Design和Text两种模式res/values/strings.xml 可以理解为i18n文件,这个文件用来存放程序调用的各种字符串src/com/example/helloandroid/MyActivity.java 这个就是我们的主程序类,等下要实现的功能都在这个文件里添加首先为应用添加一个id为hellotextView的textview和一个id为hellobutton 的button,mail.xml 代码如下:代码和控件用到的字符串定义如下:主程序中定义button点击后改变textview显示的文本,并且弹出Toast提示信息,代码如下:代码写好后,电脑通过USB数据线连接,系统设置里的开发人员选项里打开USB 调试,在IDE中直接点Run就可以在上看到运行的效果了;应用打包应用开发完成后就要打包发布了,在IDE的Build菜单下选择Generate Signed APK 来打包应用在弹出的Wizard对话框中需要指定签名的Key,一开始没有Key你可以点击Create New来新建一个Key用于签名,填入签名所需的一些字段后生成Key文件使用生成的Key来签名应用包完成编译后会在刚才我们设置的Designation APK path下生成我们的helloandroid.apk应用包,接下来要怎么安装应用应该不用说了吧,我们的第一个Android App就这样诞生了;。
Android应用开发从入门到精通
Android应用开发从入门到精通第一章:介绍Android应用开发的基础概念Android应用开发是指基于Android操作系统平台开发的移动应用程序。
Android是一个基于Linux的开放源代码平台,它提供了强大的开发工具和丰富的API(应用程序接口),使开发者能够创建各种各样的应用程序,包括游戏、社交媒体、电子商务和工具类应用等。
Android应用开发的核心概念包括Activity、Fragment、布局文件、资源文件、Intent等。
Activity是Android应用的主要组件,每个Activity代表了应用的一个界面。
Fragment是一个可重用的界面组件,可以在Activity中动态加载和替换。
布局文件定义了Activity或Fragment中的界面元素的排列方式,可以使用XML语言编写。
资源文件包括图片、字符串、颜色等,用于应用的各种资源的管理。
Intent用于在不同的组件之间进行通信和传递数据。
第二章:Android应用开发环境的搭建要进行Android应用开发,需要搭建相应的开发环境。
首先,需要下载并安装Java Development Kit(JDK),然后下载并安装Android Studio,它是官方推荐的Android开发工具。
安装完Android Studio后,需要配置Android SDK(软件开发工具包)。
Android SDK包含了众多的开发工具和API,可以满足不同应用的需求。
配置SDK的过程通常包括选择需要安装的组件和设置相应的环境变量。
安装完成后,就可以开始进行Android应用的开发了。
第三章:Android应用的UI设计用户界面(UI)是Android应用的重要组成部分,好的UI设计能够提高用户体验。
Android提供了丰富的UI元素和布局管理器,开发者可以根据应用的需求自由选择和设计UI。
常用的UI元素包括文本框、按钮、图像视图、列表视图等。
Android提供了一套用于绘制和交互的UI组件,开发者可以通过XML文件或者代码方式来创建UI界面。
3.第一个Android程序 《Android开发从零开始》课件
第三课:第一个Android程序
Hale Waihona Puke 讲师:若水博客:/coolszy 微博:/coolszy
声明
本套视频教程适用于有一定Java基础的朋友,有J2EE开发经验甚 佳。没有学习过Java语言的朋友建议先学习Java,然后再学习本套教 程。
Android开发从零开始 谢谢大家的支持!
如果感觉课程不错,欢迎大家传播,但不得用于商业用途。
创建第一个Android程序
Notice that the "Build Target" you've selected uses the Android 1.1 platform. This means that your application will be compiled against the Android 1.1 platform library. If you recall, the AVD created above runs on the Android 1.5 platform. These don't have to match; Android applications are forward-compatible, so an application built against the 1.1 platform library will run normally on the 1.5 platform. The reverse is not true.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android初涉JNI,从零打造你的第一个demo 最近打算重构项目中的部分代码,将部分耗时或者敏感的代码放到native中实现。
说来惭愧,本人今年3月份才开始接触android开发,虽然一早就知道android中可以使用c/c++代码,但一直没有尝试。
于是趁着这次机会研究一下android中的ndk开发,花了一个下午加一个上午,经历了种种悲剧后终于跑通了第一个demo。
在整个过程中参考了无数文章,也走了很多弯路,特此写下本文章,希望帮助刚刚接触JNI的童鞋们更快的上手。
上面说的貌似是废话,现在开始进入正题。
我的开发环境是windows+eclipse,因此在开始真正写代码前,还需要在windows上搭建相关环境才能编译.so文件。
这里我推荐看下/jdksummer/articles/2166057.html这篇配置文章写的很详细。
假设你现在已经搭建好了开发环境,那么开始吧!(听着音乐,开始我们的学习吧!!)
1.打开eclipse新建一个android的工程,就叫"MyFirstJNI"吧。
建立后添加一个class 文件作为jni的接口,我是这样添加的
在该类中添加如下代码:都是一些很简单的函数^^
package om.example.myjni;
2
3 public class JNI {
4 public native void write();
5 public native String sayHello();
6 public native int plus(int a, int b);
7 }
这个就是native code在java中的接口了。
添加完成后,build project。
第一步的准备工作就此完成,很容易吧。
2.打开cmd并定位到刚刚新建的"MyFirstJNI"工程目录下的bin/classes目录,执行”javah -classpath . -jni com.example.myjni.JNI“,没有意外的话,bin/classes 目录下应该会产生一个com_example_myjni_JNI.h文件。
这个就是native code需要实现的函数了。
3.现在我们把刚刚得到的.h文件拷贝出,为它新建一个工程,我是手工建立的。
建立D:\MyfirstJNISO目录,并建立子目录jni(必须叫这个,否则后面会不能编译哦),并将.h 文件拷贝到该目录下,并新建一个com_example_myjni_JNI.c文件实现相关函数,代码如下:
#include
<string.h>
0 2 #include
"com_example_myjni_JNI.h"
0 3 0 4 0 5
0 6 JNIEXPORT void JNICALL Java_com_example_myjni_JNI_write
7
(JNIEnv *env, jobject thiz) 0
8
{
9
1
}
1
1
1 2 / *
1 3
* Class: com_example_myjni_JNI
1 4
* Method: sayHello
1 5
* Signature: ()Ljava/lang/String;
1
6
*/
1 7 JNIEXPORT jstring JNICALL Java_com_example_myjni_JNI_sayHello
1
8
(JNIEnv *env, jobject thiz)
1
9
{
2
return(*env)->NewStringUTF(env, "Hello from JNI !"); 2
1
}
2
2
2 3 / *
2 4
* Class: com_example_myjni_JNI
2
5
* Method: plus 2
6
* Signature: (II)I 2
7
*/
2 8 JNIEXPORT jint JNICALL Java_com_example_myjni_JNI_plus
2 9 (JNIEnv *env, jobject thiz, jint a, jint b)
3
{
3
1
return a+b;
3
2
}
接着还需要同一个目录下添加一个Android.mk文件,编译时候使用,具体内容如下:LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := first_jni (最终so文件名是
lib first_jni.so)
LOCAL_SRC_FILES := com_example_myjni_JNI.c (代码)
include $(BUILD_SHARED_LIBRARY)
是不是很麻烦,不过我们已经离成功越来越近了。
3.现在整理一下,我们到目前为止的工作,新建了一个android工程以及一个C的工程(暂且叫工程吧),现在开始最重要的一步,编译c代码生成.so文件让android工程中的调用。
你现在应该已经配置好了cygwin了吧,打开吧,定位到C工程目录,比如
D:\myfirstJNISO的话就执行”cd /cygdrive/D/myfirstJNISO“,然后执
行”$NDK/ndk-build
“(其中$NDK和你配置的cygwin有关)。
这样编译的工作就完成了,如果你前面没有范任何错的话。
赶紧打开C工程目录吧应该是这样的吧
黄色标记的目录就是我们需要的东西哦,里面是一个”armeabi“文件夹,里面是编译得到的.so文件。
final.将上面的armeabi文件夹整个拷贝到我们一开始建立的MyfirstJNI工程的libs 目录下,所有工作都已就绪,你的工程应该是这样的:
(ps:请忽略android-support-v4.jar这个和本次的内容没关系)
现在就来编写java代码调用吧,在MainActivity中添加必须的代码:
1 static {
2 System.loadLibrary("first_jni");
3 }
这个是让系统加载so库,注意编译生成的库的名字是带前缀lib的,代码中请忽略否则会找不到响应的so文件。
调用就很简单了:
1 jni = new JNI();
2
3 jni.sayHello();
4
5 jni.plus(1,2);
最后添加一些简单的button测试一下吧,我做的比较简陋了:。