NDK全称为Native Development Kit,是本地开发工具集。在Android开发中,有时为了能更好的重用以前的C/C++的代码,需要将这些代码编译成相应的so,然后通地JNI以供上层JAVA调用。当然,也有的是为了更高的保护性和安全性。下面是实现的过程。

1、下载NDK TOOL

可以从http://developer.android.com/tools/sdk/ndk/index.html下载NDK TOOL,我下的是Windows 64-bit。

下载完后,直接安装,路径建议在根目录下,比如D:\android-ndk-windows,然后将该路径设置成环境变量。

2、测试下ndk的示例

NDK TOOL中自带了很多例子,可以用ECLIPSE导入,示例位置在D:\android-ndk-windows\samples。刚刚的下载网站后面有示例的说明(见下图)。

注:

(1)、<ndk-root>指的就是ndk的根目录,D:\android-ndk-windows.

(2)、jni文件夹是必须的,如果自己新建项目,一定要记得把C代码和mk文件放到jni文件夹下。

(3)、打开CMD命令行,定位到工程所在的jni文件夹,直接输入ndk-build回车即可生成相应的so.如果没有将D:\android-ndk-windows设置成环境变量,需要输入D:\android-ndk-windows\ndk-build。

(4)、执行完后,会在lib下的armeabi和armeabi-v7a下生成*.so文件。见下图。

3、新建一个Android工程

(1)、在eclipse中建一个SharedObjectTest的Android工程,MainActivity.java的代码如下:

MainActivity.java

package com.ex.sot;import android.app.Activity;
import android.os.Bundle;import com.example.sumcalculator.R;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);int cs = NativeMachine.calculate(1,2); setTitle(cs + "");}}

(2)、增加一个NativeMachine.java的类。代码如下:

NativeMachine.java

package com.ex.sot;import android.util.Log;public class NativeMachine {static {try {Log.i("JNI", "Trying to load libNativeJniAdder.so");System.loadLibrary("NativeMachine");} catch (UnsatisfiedLinkError ule) {Log.e("JNI", "WARNING:Gould not load libNativeJniAdder.so");}}public static native int calculate(int digit_1,int digit_2);
}

3、JNI调用

(1)、执行genHeader.bat脚本,生成相应的头。

javah -classpath ../src com.ex.sot.NativeDataManage

(2)、调用的实现

com_ex_sot_NativeMachine.c

#include "Machine.h"
#include "com_ex_sot_NativeMachine.h"
extern void* MachineNew();
JNIEXPORT jint JNICALLJava_com_ex_sot_NativeMachine_calculate(JNIEnv *env,jclass c,jint digit_1,jint digit_2){Machine* hadder=(Machine*)MachineNew();int newSn=hadder->encodeSn(hadder,digit_1);return newSn;
}

4、用C实现功能

Machine.h

/* HalfAdder.h */
#ifndef HMACHINE_H
#define HMACHINE_H
#include "lw_oopc.h"
CLASS(Machine){int sn;int(*encodeSn)(void*,int);
};
#endif

Machine.c

/* Machine.c */
#include "Machine.h"static int encodeSn(void* t,int sn){Machine* cthis=(Machine*)t;cthis->sn=sn;int newSn=cthis->sn*123;return newSn;
}CTOR(Machine)FUNCTION_SETTING(encodeSn,encodeSn)
END_CTOR
/* end */

lw_oopc.h

/* lw_oopc.h */
#ifndef LOOPC_H
#define LOOPC_H
#include <malloc.h>
#define CLASS(type)\
typedef struct type type;\
struct type#define CTOR(type)\
void* type##New()\
{\struct type *t;\t=(struct type*)malloc(sizeof(struct type));#define CTOR2(type,type2)\
void* type2##New()\
{\struct type *t;\t=(struct type *)malloc(sizeof(struct type));#define END_CTOR return (void*)t; };
#define FUNCTION_SETTING(f1,f2) t->f1=f2;
#define IMPLEMENTS(type) struct type type
#define INTERFACE(type) struct type
#endif
/* end */

注:lw_oopc.h是c的面向对象实现,即常说的oopc。

5、编译动态库

定位到工程目录下,执行ndk-build,生成*.so。

注:Android.mk和Application.mk是固定的名称。其中Android.mk中的LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_CFLAGS是需要作相应的修改。

Android.mk(部分代码)

LOCAL_MODULE := NativeMachineLOCAL_SRC_FILES := Machine.cifeq ($(TARGET_ARCH_ABI),armeabi-v7a)LOCAL_CFLAGS := -DHAVE_MACHINE=1LOCAL_SRC_FILES += com_ex_sot_NativeMachine.c
endif

6、安装APK并运行

源码下载

转载请注明出处:

转载于:https://www.cnblogs.com/sparkleDai/p/7605015.html

Android之NDK开发的简单实例相关推荐

  1. Android之NDK开发学习总结

    Android之NDK开发 http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台 ...

  2. Android之NDK开发

    一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语 ...

  3. JNI编程基础(二)——Android Studio NDK开发

    由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的N ...

  4. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

  5. Android下NDK开发环境搭建

    Android下NDK开发环境搭建 1.     AndroidNDK安装与配置 1.1  NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...

  6. android 简单实现圆角,Android 实现圆角图片的简单实例

    Android 实现圆角图片的简单实例 实现效果图: 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出.于是自己自定义了个View,实现图片的圆角以及圆形效 ...

  7. 016 Android之NDK开发

    文章目录 NDK入门指南 下载NDK和工具 NDK工程说明 JNI数据类型 JNI中的描述符 JNI基本使用 JAVA代码调用C++代码 C++代码调用JAVA代码 C++代码修改JAVA字段 动态注 ...

  8. Android之NDK开发初体验

    记得前年开始自己在项目中使用第三方so库的时候就接触NDK编程开发了,只不过哪个时候自己是输出了"Hello Wrold~!".如今一年多的时间过去了,回头拾起之前的代码再次翻看. ...

  9. 第二章:Android之NDK配置与简单使用

    使用Android开发App不只是使用Java,还可以使用C/C++,这就是我们要使用NDK的目的 -- 为了能让Java识别所要调用的C/C++. 第二章 NDK配置与简单使用 前言 对于有过开发跨 ...

最新文章

  1. 云朵机(人造云朵,造云机)用在互动百科推搜索新方法中(转)
  2. 不定积分24个基本公式_不定积分计算—典型题及解题技巧
  3. sdut 双向队列(STL)
  4. Fastformer:简单又好用的Transformer变体!清华MSRA开源线性复杂度的Fastformer!
  5. cad怎么选择一个对象打散vba_CAD制图的二十四字秘诀!
  6. 无法在PC上找到,android app 创建的文件 问题.
  7. 在 Mac 上的登录窗口中如何打开辅助功能选项?
  8. 发那科服务器显示021,发那科(FANUC)系统报警代码大全
  9. 新建raw data 分区
  10. linux ipv6 前缀 定义,IPv6 地址前缀
  11. 4-产品需求文档PRD
  12. Python3学习笔记十三
  13. 【MATLAB图像处理】图像复原
  14. [附源码]java毕业设计网上宠物商店
  15. 干货!常见waf识别
  16. Retrofit(一)
  17. js第三章简答题5(制作如图所示的Tab切换效果)
  18. 如何将图片批量合并成PDF?
  19. for-each快捷键
  20. UE4 角色预览与头像生成 CaptureSceneComponent2D 看这一篇就够了

热门文章

  1. Android中Handler
  2. 国内ntp时间服务器ip地址
  3. Windows下编译Chrome V8
  4. COM组件转换成.NET组件[转]
  5. share_ptr_c++11
  6. 看腾讯运维应对“18岁照片全民怀旧”事件的方案,你一定不后悔!
  7. 本地Yum仓库搭建部署
  8. 5.JasperReports学习笔记5-其它数据生成动态的报表(WEB)
  9. android binder机制之——(创建binder服务)
  10. Ubuntu 13.04 安装 OpenCV 及试用