android NDK编程实例操作

合集下载

android NDK编译(导入).a文件和编译多个so文件

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

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开发指南

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编程

Android平台应用软件开发课件:Android NDK编程
库都是用C/C++代码编写的。 (3) 代码的保护。由于apk的Java层代码很容易被反编译,
而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开发入门实例

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

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交叉编译路径

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开发之环境配置和简单实例

【推荐下载】Android Studio NDK开发之环境配置和简单实例
-jnisourcecodehook.example.sourcecodehook.HookSourceJNI命令完成后会生成头文
件在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

ndk编译dlib

ndk编译dlib

ndk编译dlib如何使用NDK编译dlib库安装在Android设备上NDK(Native Development Kit)是Android平台上用于编译C++代码的工具集。

dlib是一个强大的C++人脸识别和机器学习库,由于其高效的性能和易于使用的API而广受开发者的喜爱。

本文将介绍如何使用NDK 编译dlib库,并将其安装到Android设备上。

步骤1:准备工作首先,确保你的开发环境已经配置好了NDK。

你可以从Android开发者官网上下载最新的NDK版本,并将其安装到你的开发机器上。

确保NDK 的路径已经加入到系统环境变量中,这样才能在终端窗口中使用NDK命令。

此外,你还需要下载dlib库的源代码。

你可以从dlib官方网站或者GitHub 上下载最新的源代码压缩包。

解压缩后,你会得到dlib文件夹,其中包含了dlib的所有代码和依赖库。

步骤2:创建Android Studio项目在编译dlib库之前,我们需要先创建一个Android Studio项目,并配置相关的开发环境。

在Android Studio中选择“File”- “New”- “New Project”创建一个新的项目。

在项目创建过程中,你可以根据自己的需要进行一些基本的配置,如项目名称、包名和目标API等。

接下来,选择“Next”并选择“Add No Activity”选项,然后点击“Finish”按钮完成项目创建。

步骤3:配置项目在创建项目后,首先需要配置NDK环境。

打开你的项目的build.gradle 文件,将下面的代码添加到android块中。

groovyandroid {...externalNativeBuild {ndkBuild {path 'src/main/jni/Android.mk'}}...}在项目的app文件夹下创建一个新的文件夹,命名为“jni”。

在“jni”文件夹下创建一个名为“Android.mk”的文件,并将下面的代码复制到该文件中。

最简单的Android项目(NDK命令行编译)

最简单的Android项目(NDK命令行编译)

最简单的Android项⽬(NDK命令⾏编译)Android的NDK编程需要下载NDK编译环境,可以从下载window64位版,然后解压到任意⽬录即可。

NDK的实现其实是利⽤⾥Java的jni⽅法,所以前期的步骤可以参考jni的实现⽅法,只是编译时可以利⽤NDK⼯具来进⾏。

⾸先将Java源程序写好,例如:1package test.android;23import android.app.Activity;4import android.os.Bundle;5import android.view.View;6import android.widget.Toast;7import android.widget.LinearLayout;8import android.widget.Button;910public class Mini extends Activity {1112static {13 System.loadLibrary("jt");14 }1516public native String stringFromJNI();1718public void onCreate(Bundle savedInstanceState) {19super.onCreate(savedInstanceState);2021 LinearLayout lla = new LinearLayout(this);22 Button b = new Button(this);23 b.setText("click me");2425 lla.addView(b);26this.setContentView(lla);2728final Activity _this = this;2930 b.setOnClickListener(new View.OnClickListener() {31 @Override32public void onClick(View v) {33 Toast.makeText(_this, stringFromJNI(), Toast.LENGTH_LONG).show();34 }35 });36 }37 }利⽤javah⼯具⽣成.h头⽂件,然后在项⽬根⽬录新建jni⽬录,在jni⽬录新建jni.c⽂件,如下:1 #include <string.h>2 #include <jni.h>3 #include "test_android_Mini.h"45 JNIEXPORT jstring JNICALL Java_test_android_Mini_stringFromJNI6 (JNIEnv *env, jobject _this)7 {8return (*env)->NewStringUTF(env, "return from c");9 }在jni⽬录⾥新建Android.mk⽂件(注意⼤⼩写),这个⽂件是说明如何编译动态链接库的,内容如下:1 LOCAL_PATH := $(call my-dir)23 include $(CLEAR_VARS)45 LOCAL_MODULE := jt6 LOCAL_SRC_FILES := jni.c78 include $(BUILD_SHARED_LIBRARY)打开命令处理程序,切换到项⽬⽬录,输⼊以下命令:D:\Android\android-ndk-r11c\ndk-buildndk-build前⾯是你的ndk解压⽬录。

android开发实践之ndk编译命令简单示例

android开发实践之ndk编译命令简单示例

android开发实践之ndk编译命令简单⽰例前⾔Android提供了NDK⼯具,⽤来编译native代码(c/c++),该⼯具配置好了相关的交叉编译环境和⼯具链,只需要你简单地编写⼏个.mk⽂件即可将你的c/c++代码编译为Android的java⼯程/Android⼿机可以识别、加载和运⾏的库或者应⽤程序。

默认情况下,使⽤NDK编译c/c++代码,需要将该代码放置到任⼀个Android应⽤⼯程的jni⽬录下,然后编写相应的Android.mk⽂件,并执⾏ndk-build命令完成编译。

其实你也是可以在任意⽬录下去编译native代码的,只需要在ndk-build命令后⾯添加相应的命令⾏参数即可,这⾥给出⼀些常⽤的ndk-build命令⾏参数,⽅便⼤家灵活地使⽤NDK编译⾃⼰的native代码,具体的⽰例我将会在后续的⽂章中给出。

ndk-build命令⾏参数1、ndk-build NDK_LOG=1⽤于配置LOG级别,打印ndk编译时的详细输出信息2、ndk-build NDK_PROJECT_PATH=.指定NDK编译的代码路径为当前⽬录,如果不配置,则必须把⼯程代码放到Android⼯程的jni⽬录下3、ndk-build APP_BUILD_SCRIPT=./Android.mk指定NDK编译使⽤的Android.mk⽂件4、ndk-build NDK_APPLICATION_MK=./Application.mk指定NDK编译使⽤的application.mk⽂件5、ndk-build clean清除所有编译出来的临时⽂件和⽬标⽂件6、ndk-build -B强制重新编译已经编译完成的代码7、ndk-build NDK_DEBUG=1执⾏ debug build8、ndk-build NDK_DEBUG=0执⾏ release build9、ndk-build NDK_OUT=./mydir指定编译⽣成的⽂件的存放位置10、ndk-build -C /opt/myTest/到指定⽬录编译native代码例:编写 .c ⽂件假设你在 ~/math ⽬录下编写了⼀个 math.c ⽂件,内容如下:#include <stdio.h>int add( int a , int b ) {return a+b;}编写 Android.mk ⽂件,内容如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := dmathLOCAL_SRC_FILES := math.cinclude $(BUILD_SHARED_LIBRARY)在 ~/math ⽬录下,执⾏ndk-build命令,参数如下:$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk或:ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mkNDK_PROJECT_PATH 指定了需要编译的代码的⼯程⽬录,这⾥给出的是当前⽬录,APP_BUILD_SCRIPT给出的是Android makefile⽂件的路径,当然,如果你还有 Application.mk ⽂件的话,则可以添加NDK_APP_APPLICATION_MK=./Application.mk执⾏完ndk-build命令后,你会发现当前⽬录下,⽣成了 obj 和 libs ⽂件夹,这样,你的libdmath.so动态库就已经制作完成了,在 libs/armeabi ⽬录下。

android中使用c++的介绍与示例代码

android中使用c++的介绍与示例代码

android中使用c++的介绍与示例代码在Android中使用C++是一种常见的做法,特别是在开发游戏和需要高性能的应用程序时。

下面是一个简单的介绍和示例代码,帮助您开始在Android中使用C++。

介绍:在Android中使用C++,通常需要使用NDK(Native Development Kit)。

NDK允许您在Android应用程序中编写和编译C++代码,并将其与Java或Kotlin代码集成。

使用NDK,您可以利用C++的性能优势,同时保留Android的功能和用户界面。

示例代码:下面是一个简单的示例,演示如何在Android中使用C++编写一个函数,该函数将两个整数相加并返回结果。

1. 创建一个新的Android项目并打开CMakeLists.txt文件。

2. 添加以下代码以配置CMake:```cmakecmake_minimum_required(VERSION 3.4.1)add_library(native-lib SHAREDnative-lib.cpp)find_library(log-liblog)target_link_libraries(native-lib${log-lib})```3. 创建一个名为native-lib.cpp的C++文件,并添加以下代码:```cpp#include <jni.h>#include <string>extern "C" JNIEXPORT jstring JNICALLJava_com_example_myapp_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());}```4. 在您的Java或Kotlin代码中,添加以下内容以加载库并调用C++函数:```javapublic class MainActivity extends AppCompatActivity {static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);TextView textView = findViewById(R.id.textView);textView.setText(stringFromJNI());}public native String stringFromJNI();}```5. 构建和运行您的应用程序。

Linux命令行下编译AndroidNDK的示例代码

Linux命令行下编译AndroidNDK的示例代码

Linux命令⾏下编译AndroidNDK的⽰例代码这⼏天琢磨写⼀个Android的Runtime⽤来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运⾏速度也能接近原⽣应⽤。

所以花了点时间研究Android NDK,⽹上的资料都是讲IDE⾥的编译⽅法,这⾥记录⼀下命令⾏下的编译⽅法,供有需要的朋友参考。

这⾥以编译hello-gl2为例:0.安装Android NDK/SDK,设置PATH变量(根据具体情况调整)PATH=$PATH:/work/android/android-sdk-linux/platform-tools/:/work/android/android-sdk-linux/tools/PATH=$PATH:/work/android/android-ndk-r8/build/tools:/work/android/android-ndk-r8/export PATH1.⽤android创建⼀个新⼯程cd /work/android/android-ndk-r8/samplesandroid create project -n Hello -p hello -a Main -k com.hello -t 1创建这个⼯程的⽬的是产⽣ant编译需要的⽂件:build.xmllocal.propertiesproject.properties2.现在需要编译那个NDK例⼦,就把这⼏个⽂件拷贝到对应的⽬录下。

这⾥编译hello-gl2:[lixianjing@lixianjing samples]$ cp hello/build.xml hello-gl2/[lixianjing@lixianjing samples]$ cp hello/local.properties hello-gl2/[lixianjing@lixianjing samples]$ cp hello/project.properties hello-gl2/3.然后编译,先⽤ndk-build编译原⽣代码,再⽤ant debug⽣产apk。

ndk 包编译生成方法

ndk 包编译生成方法

ndk 包编译生成方法NDK包编译生成方法NDK(Native Development Kit)是一种用于开发和编译原生代码的工具集,可以让开发者使用C、C++等语言编写高性能的代码。

在Android 开发中,有时需要使用NDK来编译生成一些原生库,以提高应用程序的性能或使用一些底层的功能。

本文将逐步介绍如何使用NDK包编译生成自己的应用程序。

步骤一:准备环境在使用NDK前,我们需要确保已经安装了以下环境:1. JDK(Java Development Kit):在开发Android应用程序时需要使用Java进行开发,所以需要先安装JDK。

2. Android Studio:Android Studio是一种用于开发Android应用程序的集成开发环境(IDE),其中已经包含了NDK工具集。

3. NDK:NDK是需要单独下载和安装的工具集,开发者可以根据自己的需求选择下载与安装。

可以在Android Studio中通过SDK Manager安装。

步骤二:配置项目1. 在Android Studio中创建一个新的项目或打开现有的项目。

2. 打开项目的build.gradle文件,例如app/build.gradle。

3. 在android节点下,添加以下代码:externalNativeBuild {ndkBuild {path 'src/main/jni/Android.mk'}}这段代码告诉Android Studio使用NDK来编译生成应用程序。

4. 在jni目录下创建一个Android.mk文件,该文件指示了如何编译生成你的应用程序。

makefileLOCAL_PATH := (call my-dir)include (CLEAR_VARS)LOCAL_MODULE := mylibLOCAL_SRC_FILES := mylib.cppinclude (BUILD_SHARED_LIBRARY)上述代码中,LOCAL_MODULE指示生成的库的名称,LOCAL_SRC_FILES 指定了要编译生成的源文件,如上所示,我们指定了一个名为mylib.cpp 的源文件。

android ndk 教程

android ndk 教程

一。

安装cygwin1.下载cygwin打开setup.exe.选择本地安装,解压devel install.rar到D盘。

选择package点击变成点下一步2.完成安装后打开Cygwin输入make -v和gcc -v检查是否安装成功。

二。

安装ndk1.解压android-ndk-r4b.zip到D:\android\android-ndk-r4b\2.修改cygwin目录(/home/username)下的.bash_profile追加下面代码后重启软件。

NDKROOT=NDK路径,如:(注意没有换行键)NDKROOT=/cygdrive/d/android/android-ndk-r4bexport NDKROOT3.在shell输入cd $NDKROOT进入目录后输入“build/host-setup.sh”(android-ndk-r4b无需执行, android-ndk-1.6_r1要执行)三。

创建JNI项目(先安装windows的jdk和设置环境变量)1.在ndk目录下(D:\android\android-ndk-r4b)建立apps目录,在apps下建立目录jnidemo,在jnidemo目录下建立project目录.2.打开eclipse选择菜单file->new->android project建立项目如图3.菜单new->class创建一个类,如图生成一个Jni.java文件。

在该文件里声明本地方法,如public class Jni {public native int jni_fun(int a, int[] buf1, byte[] buf2);}4.把Jni.java复制到bin目录。

在shell执行javac Jni.java生成Jni.class。

把Jni.class 替换bin\com\jnidemo下的同名文件。

5.把shell目录转到bin下。

androidNDK编译(导入).a文件和编译多个so文件(转)

androidNDK编译(导入).a文件和编译多个so文件(转)

androidNDK编译(导⼊).a⽂件和编译多个so⽂件(转)源:⼀、编译⼀个静态库 libstatic_android.aLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := static_androidLOCAL_SRC_FILES := libstatic_android.ainclude $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)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_VARS)开始,以include $(BUILD_XXX)结束。

include $(CLEAR_VARS) CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

NDK配置以及实例详解要点

NDK配置以及实例详解要点

一、NDK 环境的搭建和简单的使用首先,要进行 Android 程序的开发, Android 的 SDK 是必须要安装的。

当然,Java 环境也必不可少。

安装NDK1.下载NDK安装包:/sdk/ndk/index.html建议下载最新的2.下载完成后,解压到~/目录下此时你会得到一个 android-ndk-r6的目录在linux下其实到这里就可以了使用NDK接下来看看NDK自带的document3.首先进入 /home/wzhnsc/android-ndk-r4b 目录,此目录下有个 README.TXT 文件,里面提到了:在 docs/STABLE-APIS.TXT 里面是 APIs 的文档,在 docs/INSTALL.TXT 里面是如何安装NDK(以前的版本都需要运行 build/host-setup.sh 来进行初始化,这个android-ndk-rb4及以上版本把它去除了,使用更方便了,只是像如下配置一下环境变量即可 )在 docs/HOWTO.TXT 里面是如何使用NDK。

注:建议这些文档都看一遍,有个大概了解。

4.配置NDK的环境变量$gedit ~/.bashrc注:在打开的文件末尾添加,如下内容NDK=$HOME/android-ndk-r6/ (这里就是你自己解压后的文件目录的位置) export NDK执行下面的命令,保存环境便利,然后查看是否生效:oss@newoss:~/android-ndk-r6$ source ~/.bashrc/home/oss/android-ndk-r6/oss@newoss:~/android-ndk-r6$经过了上述步骤,在命令行下敲:ndk-bulid弹出如下的错误,而不是说ndk-build not found,就说明ndk环境已经安装成功了。

Android NDK: Could not find application project directory !Android NDK: Please define the NDK_PROJECT_PATH variable to point to it./home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting . Stop.5.编译有两种方法:1)在目标工程目录下编译:$cd /home/oss/android-ndk-r6/samples/hello-jni进入例子目录$NDK/ndk-build2)在任意目录下编译:$NDK/ndk-build -C /home/oss/android-ndk-r6/samples/hello-jni用 -C 指出工程目录路径注:无论哪种编译,成功后就会在当前目录下多生成 libs 与 obj 两个子目录。

ndk的使用流程

ndk的使用流程

ndk的使用流程NDK(Native Development Kit)是Android提供的一个开发工具包,用于开发C/C++库,并将其集成到Android应用程序中。

NDK的使用流程可以分为以下几个步骤。

第一步,安装配置NDK。

首先需要下载NDK,可以从Android官方网站或者Android Studio的SDK Manager中下载安装。

安装完成后,需要配置NDK的环境变量,以便在命令行中可以直接使用NDK提供的工具。

第二步,创建NDK项目。

可以使用Android Studio创建一个新的NDK项目,或者将NDK集成到现有的Android项目中。

在项目的build.gradle文件中,需要添加NDK的配置信息,包括NDK的版本和需要编译的C/C++文件路径。

第三步,编写C/C++代码。

在项目中创建一个jni目录,用于存放C/C++代码。

在该目录下,可以创建多个C/C++文件,用于实现不同的功能。

在编写代码时,需要注意使用C/C++的语法和规范,并且可以使用NDK提供的一些特定的API和函数。

第四步,编译C/C++代码。

在命令行中进入到项目的根目录下,执行命令"ndk-build",即可编译C/C++代码。

编译完成后,会生成对应的动态链接库文件(.so文件),可以在项目的libs目录下找到。

第五步,配置JNI接口。

在Java代码中,需要通过JNI(JavaNative Interface)来调用C/C++代码。

首先需要创建一个Java类,用于定义JNI接口。

在该类中,可以使用native关键字声明需要调用的C/C++函数。

然后,在命令行中执行命令"javah",可以生成对应的JNI头文件。

将该头文件拷贝到jni目录下,并在其中实现JNI函数的具体逻辑。

第六步,使用JNI接口。

在Java代码中,可以通过调用JNI接口来使用C/C++代码。

首先需要加载动态链接库文件,可以使用System.loadLibrary()方法来实现。

Android NDK使用方法

Android NDK使用方法

Android NDK使用方法目前Android NDK只能编译出动态库.so文件,并不是能生成.apk文件,所以要调用底层的NDK程序必须分两个部分单独编写。

本文档将按照开发人员编码顺序介绍如何使用NDK。

本文使用的NDK版本为1.6r1版本,因为不想配置交叉编译环境直接使用了linux 版本的NDK在linux机器上编译。

1.首先让NDK环境正确配置完成然后才可以添加自己的代码编译。

下载Android 1.6r1NDK、解压到某一目录并将环境变量ANDROID_NDK_ROOT 设为你解压的NDK所在路径比如我现在的NDK放在/home/once下名字为android-ndk 那么就需要用这条命令来设置环境变量2.运行更新系统工具链依赖这点没什么好讲的如果第一步配置对了那么这一步NDK会根据你的配置生成对应的工具链3. 建立你自己的工作目录在apps目录下3.1比如我的工程会放在/home/once/android-ndk/apps/下面3.2然后拷贝一个例子工程里的Application.mk到你的目录并修改里面的参数为你的工程对应的值4.新建一个文件夹名为project 这个文件夹将用来存放你的jni工程以及java工程Java工程用eclipse辅助完成即可这里我们只讲JNI工程。

我们创立一个jni文件夹在project下然后同样从例子工程的jni文件夹下面拷贝一个Android.mk文件过来将里面的参数改对如下之所以会生成动态库是因为下面这句:如果你的工程还需要依赖其他的模块就需要指定如下参数:这个libtest其实就是我们上面的module名字所以上面的Application.mk得写好依赖关系否则这个库编译的时候会找不到test库还有就是如果你想在你的NDK的c代码中打印android log那么你得再依赖一个系统库:以上几个步骤全部做完了就可以进入第5点编译一下你的ndk库看看有没错误的了5.向上层目录进入到ndk的根目录,运行make APP=hello-jni(你的项目名称 V=1打印详细-B强制重编)比如我这里的工程为email 那么如果我要编译我的工程我就用这条命令 make APP=email 如果没有错误那么基本上说明你的c代码初步编译无误。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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头文件路径,应该可以编译了。

相关文档
最新文档