/** 转载必须标明出处*/

说白了就是c代码做成动态库,被java代码调用(JNI)。用C写不出可以直接在Android上跑的可执行程序来。

NDK开发需要一个交叉编译环境,需要安装Cygwin, NDK。

这些准备工作就不说了网上很多,当然也可以问我。

讲一下.so文件的生成

--------------------------------------------------------------------------------------------------------------------------------------------------

编译Android .so文件

1. 定义native接口

创建一个Android的项目 “ndk_plus”,添加一个JNI类。


1AndroidSDK项目

// JNI.java Code:

                      package         kun.ndk.plus;
public class JNI {
public native int plus( int a, int b);
}

2. 根据JNI.java文件生成相应的.h文件

cmdndk_plus项目的bin目录,然后执行 javah –classpath . –jni kun.ndk.plus.JNI

这样就会生成kun_ndk_plus_JNI.h头文件。内容如下:

代码
                            /*           DO NOT EDIT THIS FILE - it is machine generated           */          
#include
< jni.h >
/* Header for class kun_ndk_plus_JNI */

#ifndef _Included_kun_ndk_plus_JNI
#define _Included_kun_ndk_plus_JNI
#ifdef __cplusplus
extern " C " {
#endif
/*
* Class: kun_ndk_plus_JNI
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_kun_ndk_plus_JNI_plus
(JNIEnv
* , jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

如果提示没有javah命令,则需要找到javah.exe所在目录(C:\Program Files\Java\jdk1.5.0\bin),并把这个目录添加到环境变量 PATH里。

3. 根据.h文件实现相应的.c文件

Eclipse(其它编辑工具均可)里创建kun_ndk_plus_JNI.c文件

//-------------------------------------------------------------------------------------------------------------

#include <jni.h>

#include "kun_ndk_plus_JNI.h"

JNIEXPORT jint JNICALL Java_kun_ndk_plus_JNI_plus

(JNIEnv *e, jobject j, jint a, jint b)

{

return a + b;

}

//-------------------------------------------------------------------------------------------------------------

注意红色部分。由于生成的.h中的函数声明并没有形参,实现时需要自己添加形参变量。

还要注意的是要在蓝色的大括号后面添加一个回车(gcc 编译器的特点)

4. 制作.mk文件

NDK目录下的apps目录下新建plus文件夹,在这个文件夹下创建一个txt文件,

输入一下内容:

APP_PROJECT_PATH := $(call my-dir)

APP_MODULES := plus

并重命名为Application.mk

NDK/sources/samples目录下新建plus文件夹, 在这个文件夹下创建一个txt文件,输入以下内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := plus

LOCAL_SRC_FILES := kun_ndk_plus_JNI.c

include $(BUILD_SHARED_LIBRARY)

并重名名为Android.mk。把.c.h文件拷贝到这个文件夹下。

//关键字具体含义看doc/ OVERVIEW.TXT

5. 编译

启动Cygwin, cdNDK目录

make APP=plus


成功后会在apps/plus/libs/armeabi下有一个libplus.so文件。

6. 后面就是把.so文件加到Android工程中在java代码中使用了。

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Android(安卓)studio添加httpclient的jar包
  4. Android(安卓)adb不是内部或外部命令 问题解决
  5. Android开发8——利用pull解析器读写XML文件
  6. myeclipse8.5下离线安装android
  7. Android(安卓)+ eclipse +ADT安装完全教程
  8. Android必备:Android项目的目录结构
  9. Android(安卓)自动编译、打包生成apk文件 、命令行方式

随机推荐

  1. Android home键和back键区别
  2. Android中使用SVG矢量图打造多边形图形框
  3. android重写finish实现是否退出提示功能
  4. Android UI 设计秘笈
  5. Android(安卓)Logcat输出为何能自动换行
  6. Android Bluetooth蓝牙开发:Bluetooth蓝牙
  7. Android(安卓)Volley 框架的使用(一)
  8. Android采用操作xml
  9. Android快速实现二维码扫描--Zxing
  10. 谈谈你对Android NDK的理解