android NDK编程实例操作
android NDK编译(导入).a文件和编译多个so文件

android NDK编译(导入).a文件和编译多个so文件android NDK编译(导入).a文件和编译多个so文件【字体:小大】IT者安全网()一、编译一个静态库libstatic_android.aLOCAL_PATH := $(call my-dir)include $(CLEAR_V ARS)LOCAL_MODULE := static_androidLOCAL_SRC_FILES := libstatic_android.ainclude $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_V ARS)LOCAL_MODULE := fpdfembedsdkLOCAL_SRC_FILES := xxxx.cppLOCAL_C_INCLUDES := $(LOCAL_PATH)/../include/LOCAL_LDLIBS := -llog -g -L. -ljnigraphics#fill in the foxit library here#LOCAL_LDLIBS += libstatic_android.aLOCAL_STATIC_LIBRARIES := static_androidinclude $(BUILD_SHARED_LIBRARY)#$(BUILD_STATIC_LIBRARY)二、编译多个so文件(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。
由于一般情况下Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(call my-dir)上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。
(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_V ARS)开始,以include $(BUILD_XXX)结束。
Android初涉JNI,从零打造你的第一个demo

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;23 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文件。
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等,以及相应的配置和调用方法。
Android平台应用软件开发课件:Android NDK编程

而C/C++库反编译难度较大。 (4) 便于移植。用C/C++编写的库可以方便在其他的嵌
入式平台上再次使用。
Android NDK编程
10.2.3 Android NDK开发环境的搭建 打开“开发所需工具”文件夹,打开android-ndk-r9d-
Android NDK编程 Android.mk文件的内容如下:Android NDK编程
现在,就开始编译hello.c这个文件,将其编译为.so的库 文件。编译过程如下:
打开命令窗口,进入到项目所的根目录下。如本节项目 存放在D:\spaces\NDK,则在命令窗口中输入d:回车,cd spaces回车,cd NDK回车。
Android NDK编程
10.1.2 使用JNI机制产生的副作用 一旦使用JNI,Java程序就丧失了Java平台的两个优点: (1) 程序不再跨平台。 (2) 程序不再是绝对安全的,本地代码的不当使用可能
导致整个程序崩溃。
Android NDK编程
10.1.3 JNI机制的使用场合 应用程序使用JNI会带来一些副作用,因此当着手准备
Android NDK编程
下面这些场合中,JNI的使用无法避免: (1) 程序当中用到了Java API不提供的特殊系统环境才 会有的特征,而跨进程操作又不现实。 (2) 访问一些已有的本地库,但又不想付出跨进程调用 时的代价,如效率、内存、数据传递方面。 (3) Java程序当中的一部分代码对效率要求非常高,如 算法计算,图形渲染等。
Android NDK编程
10.2 Android NDK编程
Android NDK开发入门实例

1.进行NDK开发前的准备JDK下载安装:/technetwork/java/javase/downloads/jdk7-downloads-1880260.html Eclipse+SDK下载安装:/sdk/index.htmlADT在线安装:/android/eclipse/Cygwin下载安装:/NDK下载安装:/tools/sdk/ndk/index.html2.NDK正式开发A.Eclipse中新建Android项目,并添加android代码。
src/com/android/testndk/Main.java代码如下:package com.android.testndk;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;public class Main extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView myTextView = new TextView(this);myTextView.setText( stringTestNdk() );setContentView(myTextView);}public native String stringTestNdk();static {System.loadLibrary("myjni");}}B.在Android项目中新建文件夹jni,并仿照NDK安装目录下/samples/hello-jni项目里的jni目录重写Android.mk和*.c文件。
Android.mk文件:(:=是赋值的意思,$是引用某变量的值,参考GNU_Make手册)LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE :=myjniLOCAL_SRC_FILES :=myjni.cinclude $(BUILD_SHARED_LIBRARY)注释:LOCAL_PATH := $(call my-dir):调用my-dir函数,返回Android.mk所在目录。
ndk

Linux下的NDK配置及其编译本文在Ubuntu 系统下搭建Android NDK 开发环境,并编写简单例子生成.so文件供Java层调用。
1、搭建Android NDK 开发环境1、下载NDK(我使用的是android-ndk-r5b-linux-x86.tar.bz2)2、解压到Linux用户目录,解压后的文件夹为android-ndk-r5b如果不知道当前用户目录,可以进入终端,输入echo $HOME我的用户目录为/home/billy,为了管理方便,我在用户目录下又建了一个名为software的文件夹,然后将NDK就解压到这个文件夹中。
3、配置NDK的环境变量3.1 在终端下输入gedit ~/.bashrc,然后在打开的文件末尾添加如下内容NDK=~/software/android-ndk-r5b (这里的~表示用户目录,也就是/home/billy)export NDK/保存退出3.2 为了使设置马上生效,还需要在终端输入如下内容:source ~/.bashrc由于source命令也称为“点命令”,也就是一个点符号(.),所以也可以输入$. ~/.bashrc经过上面的配置后,以后NDK就代表了/home/billy/software/android-ndk-r5b这个路径目录了3.3 最后测试一下配置是否成功在终端下输入echo $NDK显示/home/billy/software/android-ndk-r5b,表示环境变量已经配置成功说明:网上介绍用vi ~/.bashrc这个命令打开文件配置环境变量,但我尝试这种方法不管用4、编译so文件的方法在解压后的NDK目录中有一个名为ndk-build的文件,编译so文件就需要用到这个文件。
在解压后的NDK目录下的sample文件夹中有很多例子,这里已其中的hello-jni为例说明。
编译有两种方法:一种是在目标工程目录下编译,另一种是在任意目录下编译4.1 在目标工程目录下编译首先打开终端,cd到目标工程目录cd ./software/android-ndk-r5b/sample/hello-jni (这里的点也表示用户目录)然后输入$NDK/ndk-build即可如果之前没有配置NDK环境变量的话,这里就要输入很长的路径了/home/billy/software/android-ndk-r5b/ndk-build4.2在任意目录下编译在终端下直接输入$NDK/ndk-build –C ./software/android-ndk-r5b/sample/hello-jni一般采用的是第一种方法,无论哪种方法编译,编译成功后在工程目录中都会生成libs 与obj 两个子目录,so库就在libs文件夹中。
android ndk交叉编译路径

android ndk交叉编译路径交叉编译是针对特定目标平台的编译过程,NDK (Native Development Kit) 是 Android 平台上的一个工具集,用于支持 C/C++ 代码的编译。
交叉编译的路径主要取决于你的 NDK 安装路径和目标平台。
以下是一个基本的步骤来配置交叉编译环境:1. 首先,你需要下载并安装 NDK。
你可以从 Android 开发者网站上下载NDK,然后将其解压到你选择的目录中。
2. 配置环境变量。
在你的终端或命令行界面中,你需要设置 NDK 的路径。
这可以通过添加以下行到你的 `.bashrc` 或 `.zshrc` 文件来完成:```bashexport NDK_HOME=/path/to/your/ndkexport PATH=$NDK_HOME/bin:$PATH```3. 配置 SYSROOT 环境变量。
SYSROOT 指定了头文件和库文件的查找路径。
你需要根据你的目标平台来设置这个值。
例如,如果你的目标平台是Android ,你可以这样设置:```bashexport SYSROOT=$NDK_HOME/platforms/android-8/arch-arm```4. 配置 CC 环境变量。
这个变量指向交叉编译器的路径。
你可以通过以下命令来设置:```bashexport CC=$NDK_HOME/bin/arm-linux-androideabi-gcc```5. 最后,你可以通过调用 `make` 命令来编译你的项目。
例如:```bashmake -j4```以上步骤应该可以帮助你配置好交叉编译环境。
如果你在配置过程中遇到任何问题,你可能需要查阅更详细的文档或寻求社区的帮助。
【推荐下载】Android Studio NDK开发之环境配置和简单实例

件在SourceCodeHook2\app\build\intermediates\classes\debug目录下。
四、创建jni的C代码部分
在main目录下创建jni目录,并把刚才的头文件放入
2.配置C文件的路径
android{compileSdkVersion26buildToolsVersion“26.0.1”defaultConfig{
applicationId“sourcecodehook.example.sourcecodehook”minSdkVersion14
targetSdkVersion26versionCode1versionName“1.0”testInstrumentationRunner
‘src/main/jniLibs/’]}}buildTypes{release{minifyEnabledfalseproguardFiles
getDefaultProguardFile(‘proguard-android.txt’),‘proguard-rules.pro’}}}
除此之外为了不同版本的ndk和gradle之间的兼容还要配置gradle.properties文
ourcecodehook\
生成HookSourceJNI.class文件
hsf是so文件的文件名。
二、配置NDK路径
如果还没下载NDK的话,就先下载NDK
三、NDK下载完之后,就开始生成.h头文件
在Terminal命令中输入
cdapp\build\intermediates\classes\debug切换到debug目录然后执行命令javah
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android 开发手记一---- NDK 编程实例在 Android 上,应用程序的开发,大部分基于 Java 语言来实现。
要使用 c 或是 c++ 的程序或库,就需要使用 NDK 来实现。
NDK 是 Native Development Kit 的简称。
它是一个工具集,集成了 Android 的交叉编译环境,并提供了一套比较方便的 Makefile ,可以帮助开发者快速开发 C 或是 C++ 的动态库,并自动的将 so 和 java 程序打包成 apk ,在 Android 上运行。
好,闲话少说,我们以一个简单的实例,来讲解 NDK 的应用。
一开发环境的搭建这一步虽然没什么技术含量,但是对于初学者,有一个很好的入门指导,还是很有帮助的。
1.1Android SDK 的搭建首先,要进行 Android 程序的开发, Android 的 SDK 是必须要安装的。
当然, Java 环境也必不可少。
我们先要安装 JDK 和 Eclipse ,这个可以选比较新的版本,因为 Android 新的 SDK 已经不支持旧版本了。
1.1.1 JDK 可以用 V5 或 V6 版本,下载地址/javase/downloads/index.jsp1.1.2 Eclipse 可以用版本 version 3.4 or 3.5 ,下载地址/downloads/ . 当然,若你需要其他的 Java 开发环境,可以不用 Eclipse ,不过这样也就用不了 ADT(Android Development Tools) 插件了。
推荐还是用 Eclipse 来进行开发比较好,毕竟比较权威和方便么。
1.1.3 安装 SDK/sdk/tools-notes.html1.1.4 为 Eclips 安装插件 ADT 。
在 Eclipse 中,填加更新站点https:///android/eclipse/,然后选择安装ADT.1.1.5 接下来,我们选择 Android 平台和组件。
若是在 window 系统下,运行 SDK Setup.exe ;若是在 Linux 系统下,运行 tools 目录下的 android 程序,就可以选择需要的 Android Platform 和组件。
完成以上工作后,就可以进行 Android 应用程序的开发了。
可以用Eclipse 创建一个 Android 工程,比较简单的 Hello Android ,然后在模拟器下运行。
具体的操作可以参看 Android 开发网站的说明,上面有详细的步骤。
1.2 Android NDK 的搭建上面我们搭建好了SDK的环境,可以开发Java应用程序了。
要开发C的程序,还得搭建NDK环境。
NDK给我们提供了以下内容:libc (C library) headerslibm (math library) headersJNI interface headersbz (Zlib compression) headersblog (Android logging) headerA Minimal set of headers for C++ support1.2.1 NDK的安装/sdk/ndk/index.html,下载后解压即可使用。
1.2.2 若在Linux开发环境下那么,这样就可以使用了。
若是在window环境下,还需要安装cygwin。
cygwin下载地址:/这样,NDK的环境也搭建好了。
下面我们来进行实战演习。
二NDK开发实例关于NDK的使用,首先需要了解一个概念:JNI。
什么是JNI?2.1 Hello-jni这个是NDK自带的例子程序,安装官方网站的说明,一步步来,应该没有什么问题,这里就不细说了。
2.2 My God I did it学习的第一步,就是模仿。
我们依照上面Hello-jni的例子,在创建自己的NDK程序。
在此过程中,对相关的内容和概念进行分析和说明。
首先,创建自己的NDK工程。
我们在ndk的sample目录下创建自己的工程myjni,然后在这个文件夹子下,创建两个目录jni和src,jni用来放我们的c文件,src是调用的c库java接口文件。
创建好目录,接着创建文件jni/myjni.c,该文件比较简单,就是输出一个字符串,内容如下这个程序,唯一和hello-jni不同的就是引用了<android/log.h>这个头文件。
在该头文件中,声明了函数__android_log_print(),可以根据不同的log级别,输出log,方便代码的调试。
在NDK中,printf()没法输出,所以我们需要借助log库来将我们c代码库中需要输出的内容,通过java控制台输出。
调用函数__android_log_print(),就可以在Eclipse中,查看LogCat来查看相关的输出信息了。
注意:在c文件中,函数名这样定义:Java_com_jpf_myjni_MyJNI_stringFromJNI,有什么讲究么?这个是JNI的标准,定义需要按照如下格式:Java _packagename _classname _methodname ,例如:Java_com_jpf_myjni _MyJNI _stringFromJNI接着创建文件jni/Android.mk.这个文件是我们本地c代码的Makefile。
文件内容如下:分别对上述Makefile的语句进行说明。
LOCAL_PATH := $(call my-dir) 这句用来指定编译的路径。
通过调用宏my-dir,获取到当前工作的路径。
include $(CLEAR_VARS) CLEAR_VARS这个变量是编译系统提供的,用来指明一个GNU makefile文件,添加这句,主要的目的是清理所有的LOCAL_XXX.,比如LOCAL_MODULE,LOCAL_LDLIBS。
在每个新模块的开始处,需要添加这句。
LOCAL_MODULE := myjni 这句定义了模块名称,将来编译的库就以此命名。
若果编译的是动态库,那么库名就是libmyjni.so.需要注意的是,如果你定义module为libmyjni,那么系统在生成动态库的时候,就不要再为你添加lib 的前缀了,生成德动态库名字还是libmyjni.so.LOCAL_LDLIBS += -llog 这句指定了需要另外链接的库。
我们在代码中,用到了log库,所以这里加上这句。
include $(BUILD_SHARED_LIBRARY) 这句说明将来生产的库是共享库,及动态链接库。
若需要生产静态库,可以这样写:include$(BUILD_STATIC_LIBRARY)。
写完了c文件和Makefile文件,是否可以编译了呢?我们试一下。
在cygwin中,进入工程目录,运行ndk-build,得到下面的结果:看到这个错误的意思是,缺少manifest文件。
老版本的NDk,工程中有一个apps,里面包含了应用的程序文件和Application.mk。
现在的版本,不需要我们自己编写Application.mk,,不过仍需要工程相关的配置信息。
那么如何做到呢?需要手工去写manifest文件么?不需要。
我们只需要在Eclipse中,创建工程就可以了,这些配置文件会自动生成。
前面讲过,在工程的src夹子下用来放置Java文件。
我们打开Eclipse,然后新建一个Android工程,工程名就叫MyJNI,工程路径选择我们创建的NDK的路径。
这里需要注意的是,工程名,包名等,需要和上面的c文件中的保持一致。
(Java_com_jpf_myjni _MyJNI _stringFromJNI)工程建立好后,编辑src/com/jpf/myjni/MyJNI.java文件,内容如下:需要说明的几点:public native String stringFromJNI();这句申明,带有native关键字,说明该方法是本地方法。
System.loadLibrary("myjni");这句就是用来加载我们的c动态库的。
上面声明的方法,具体实现,就在我们加载的库中。
建立好工程,再次编译,在cygwin中运行ndk-build,结果OK。
我们看到,需要的共享库已经生成,并且安装好了。
下面就可以生成apk了。
在Cygwin中进行工程的build,编译后,在工程的bin目录下,会看到我们的apk包。
好,我们试试看,能否正常运行。
在Eclipse选择执行方式为Android Application,点击run,以下console的输出:上面的 warning ,是我们没有指定 API 的版本号。
如下指定一下就没有这个 warning 了。
下图为执行的效果:下图是我们查看 LogCat 的输出:2.3 Study Hard有了上面的基础,我们就可以用NDK来进行项目开发了。
我们经常会遇到这样的问题,就是将一些现有的,成熟的C库移植到Android平台上。
通过上面我们的介绍,我们已经知道,我们需要用JNI来对现有的C库包装一下,然后提供Java接口,供上层调用。
首先的问题,就是C库的编译和测试。
其实Android底层用的是Linux的内核,所以,和其他Linux程序开发一样,无法使进行交叉编译。
不过,Android有些特殊的地方,我们需要注意。
下面就以一个很简单的例子,讲讲如何应用NDK,做一个C的应用终端测试程序。
首先,创建study-hadr/study-hard.c文件,程序非常简单,就是Hello World 的c程序。
别看程序很简单,不过这个程序的编译可不简单。
若是在Linux下,只需要执行:gcc –o study-hard study-hard.c 就可以生成应用程序study-hard了。
在Android下就不是这么简单了。
在Window环境开发环境下,用到的交叉工具链,目录是/android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0。
在这个目录的bin路径下,你会看到arm-eabi为前缀的诸多工具,这些就是Android用的编译工具。
那么c库和c头文件又在哪里呢?对于Android,不同的Platform,有不同的库和头文件,需要我们自己选择。
比如,现在我们要用Platform5,那么C头文件的路径为:/android-ndk-r4/build/platforms/android-5/arch-arm/usr/includeC库的路径为:/android-ndk-r4/build/platforms/android-5/arch-arm/usr/lib好了,我们知道了C的编译工具链,知道了C库路径和C头文件路径,应该可以编译了。