最近打算重构项目中的部分代码,将部分耗时或者敏感的代码放到native中实现。说来惭愧,本人今年3月份才开始接触android开发,虽然一早就知道android中可以使用c/c++代码,但一直没有尝试。于是趁着这次机会研究一下android中的ndk开发,花了一个下午加一个上午,经历了种种悲剧后终于跑通了第一个demo。在整个过程中参考了无数文章,也走了很多弯路,特此写下本文章,希望帮助刚刚接触JNI的童鞋们更快的上手。
上面说的貌似是废话,现在开始进入正题。我的开发环境是windows+eclipse,因此在开始真正写代码前,还需要在windows上搭建相关环境才能编译.so文件。这里我推荐看下 http://www.cnblogs.com/jdksummer/articles/2166057.html 这篇配置文章写的很详细。
假设你现在已经搭建好了开发环境,那么开始吧!(听着音乐,开始我们的学习吧!!)
1.打开eclipse新建一个android的工程,就叫"MyFirstJNI"吧。建立后添加一个class文件作为jni的接口,我是这样添加的
在该类中添加如下代码:都是一些很简单的函数^^
package com.example.myjni;
public class JNI {
public native void write();
public native String sayHello();
public native int plus(int a, int b);
}
这个就是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>
#include "com_example_myjni_JNI.h"
JNIEXPORT void JNICALL Java_com_example_myjni_JNI_write
(JNIEnv *env, jobject thiz)
{
}
/*
* Class: com_example_myjni_JNI
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_myjni_JNI_sayHello
(JNIEnv *env, jobject thiz)
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
/*
* Class: com_example_myjni_JNI
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_myjni_JNI_plus
(JNIEnv *env, jobject thiz, jint a, jint b)
{
return a+b;
}
接着还需要同一个目录下添加一个Android.mk文件,编译时候使用,具体内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := first_jni (最终so文件名是libfirst_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中添加必须的代码:
static {
System.loadLibrary("first_jni");
}
这个是让系统加载so库,注意编译生成的库的名字是带前缀lib的,代码中请忽略否则会找不到相应的so文件。
调用就很简单了:
jni = new JNI();
jni.sayHello();
jni.plus(1,2);
最后添加一些简单的button测试一下吧,我做的比较简陋了:

至此,我们的第一个ndk的demo就跑起来了。
原文:
http://my.oschina.net/sosofy/blog/78353
分享到:
相关推荐
### Android初涉JNI,从零打造你的第一个demo 在深入探讨如何从零开始构建第一个JNI(Java Native Interface)示例之前,我们先简要回顾一下JNI的概念及其在Android开发中的重要性。 #### JNI简介 JNI是一种标准...
【我的第一个NDK小demo】是一个关于Android应用开发中使用NDK和JNI技术的实践教程。NDK(Native Development Kit)是Google提供的一套工具,允许开发者在Android应用中使用C/C++原生代码,以实现性能优化或者利用...
标题“Android_NDK_Demo_Test”暗示了这是一个关于Android NDK的示例测试项目,可能包含了如何在实际应用中使用NDK的实践操作。这个项目可能涵盖了NDK的集成、本地方法的创建以及编译构建过程。 描述中提到的博客...
通过这个“soxr Android ndk编译demo”,开发者可以学习如何将原生库集成到Android项目中,理解NDK编译流程,以及如何对第三方库进行平台适配。这不仅有助于提升应用的性能,还能为开发者提供更多的功能可能性。在...
这个"android 学习ndk的demo"正是一个针对初学者的实践项目,旨在帮助理解NDK的基本用法和流程。 在Android开发中,通常我们使用Java或Kotlin编写应用程序的大部分逻辑,但有些情况,如游戏引擎、图像处理、高性能...
创建一个NDK项目的第一步是配置Eclipse环境。你需要安装ADT(Android Developer Tools)插件,并确保Eclipse支持NDK集成。下载并安装NDK到指定路径,然后在Eclipse的偏好设置中配置NDK的路径。 接下来,创建一个新...
本教程将详细讲解如何通过Android Studio和NDK来生成Android平台的静态库,并创建一个使用该静态库的示例应用。 一、Android Studio与NDK集成 1. 安装NDK:首先确保你已经安装了Android Studio,并在Android ...
4. **创建第一个NDK项目** - 在Android Studio中,新建一个Android项目,选择包含“Native C++ Support”的模板。 - 创建`jni`目录,此目录下存放C/C++源代码。`JNI`是Java Native Interface的缩写,是Java调用...
标题提到的"Android Studio 基于NDK加密,防止反编译获取加密key的demo"是针对Android应用中敏感数据保护的一种常见策略。NDK(Native Development Kit)是Google提供的一套工具,允许开发者使用C/C++编写部分或全部...
在Android项目中使用NDK的第一步是设置项目结构。通常,原生代码位于项目的`src/main/jni`目录下,或者从Android Studio 3.0开始推荐的`src/main/cpp`目录。在这个例子中,“TestNdkCpp”可能包含了C++源文件,这些...
本示例"Android 使用ndk-build和cmake构建JNI程序 demo"将向你展示如何在Android项目中集成原生代码。Android NDK(Native Development Kit)提供了一种方式,让开发者可以使用这些本地语言编写应用的一部分,然后在...
1. **下载和安装NDK**:首先,你需要从Google的官方开发者网站下载适合你的操作系统的NDK版本。安装完成后,确保将其路径添加到系统环境变量,以便在任何地方都能访问。 2. **配置项目**:在Android Studio中,打开...
在这个例子中,"NDK第一个DemoCmakeList"项目的核心就在于这个文件。以下是一个基本的`CMakeLists.txt`配置示例: ```cmake cmake_minimum_required(VERSION 3.4.1) # 指定应用的包名 set(APPLICATION_PACKAGE...
NDK(Native Development Kit)是...这个Demo提供了一个基础的学习起点,通过分析和理解其中的代码,你可以深入学习NDK和JNI的更多高级特性和应用场景,比如多线程处理、异步通信、内存管理以及与硬件的直接交互等。
在Android应用开发中,接入腾讯广告的广点通SDK是一个常见的需求,这有助于开发者通过广告获得收益或提高用户参与度。本DEMO是针对Android平台的初级教程,它提供了全面的指南来集成开屏广告、插屏广告、Banner广告...
在Android开发中,JaCoCo是一个非常重要的工具...这个"android工程JaCoCo代码覆盖率Demo"将帮助你迈出实现高质量Android开发的第一步。通过实践和学习,你可以掌握这一强大工具,提升你的Android应用的健壮性和可靠性。
配置NDK开发环境是开始使用NDK的第一步。在本示例中,我们可以使用老版本的NDK,如android-ndk-r7b-windows或android-ndk-r8e-windows-x86。现在,最新的NDK版本已经更新到了r23,但理解早期版本的配置过程有助于...
通过这个"Android下jni开发Demo",你可以学习到如何从零开始创建和使用JNI模块,包括编写Java接口、生成头文件、实现本地方法、编译加载库,以及如何在Android应用中有效地调用这些本地函数。这将帮助你提升Android...
在本项目"AndroidDemo"中,我们探讨的是一个利用安卓系统进行摄像头监控的应用实例。这个项目结合了多种技术,包括JNI(Java Native Interface)调用、第三方SO(Shared Object)库的集成以及CMakeLists.txt文件的...
总结,"AndroidStudio JNIDemo"是一个实践示例,演示了如何在Android Studio环境中使用JNI从本地代码调用Java方法以及Android API。这在需要高效计算、访问硬件特性或利用第三方C/C++库时非常有用。通过理解和掌握...