Android NDK : 自己动手做so库
来源:互联网 发布:手机上传淘宝主图视频 编辑:程序博客网 时间:2024/06/06 08:51
Android NDK : 自己动手做so库
前言 :
在上一篇Android NDK : NDK开发概要 中大体记录了下Android NDK的概念,工具包以及简单了自动编译链接实现了一个hello NDK的小demo 。
现在让我们不使用NDK的自动编译链接的功能,来自己一步步的实现前面的小demo 。即亲自动手来实现我们的动态链接库 。
创建要调用本地代码的java类:
首先在我们的android项目工程中的src目录下编写要调用native的Java类 ,
package com.cumt.ndktest2;public class HelloAndroidNDK {static{//加载本地的c库文件System.loadLibrary("helloAndroidNDK");}//声明c库中的本地方法public native String sayHelloToNDK();}
接下来我们就利用这个文件来生成我们所需要的头文件
生成本地代码的头文件:
在android项目工程的根目录下新建一个jni文件夹,我们准备将生成后的头文件放在这个文件夹下 。
然后在dos中通过javah命令生成头文件 (如果你找不到javah指令那是没有配置环境变量的原因,javah指令在java的jdk的bin目录下)
javah使用方法如图所示:
此时在jni目录下就生出了头文件,在eclipse中refresh一下jni文件夹就可以看到了 :
在上一节中已经说过命名的格式,这里就不再说了。下面我们就可以让其他成员根据这个头文件和需求编写C/C++的代码,生成动态库,
再给我们使用(在具体工作中)。现在我们来自己实现这个函数 。
根据头文件编写本地代码:
//com_cumt_ndktest2_HelloAndroidNDK.c#include "com_cumt_ndktest2_HelloAndroidNDK.h"JNIEXPORT jstring JNICALL Java_com_cumt_ndktest2_HelloAndroidNDK_sayHelloToNDK (JNIEnv *env, jobject thiz){return (*env)->NewStringUTF(env,"Hello Android NDK");}
makefile文件编写:
现在开始编写makefile文件 ,其实原理和linux下差不多 ,我们看这个简单的示例 ,在jni目录下新建一个文件Android.mk :
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := helloAndroidNDKLOCAL_SRC_FILES := com_cumt_ndktest2_HelloAndroidNDK.cinclude $(BUILD_SHARED_LIBRARY)
先来解释一下makefile中这些参数的含义 :
LOCAL_PATH := $(call my-dir) Android.mk 文件必须以这个开头,用来辨识源文件的路径 $(call my-dir) 表示当前路径下即和Android.mk 位于同一个目录下 ,
也就是说我们的源文件需要和Android.mk文件在同一文件夹下。
LOCAL_SRC_FILES := com_cumt_ndktest2_HelloAndroidNDK.c 源文件
include $(BUILD_SHARED_LIBRARY) 标识生成动态库 (也可以通过 BUILD_STATIC_LIBRARY生成静态库)
使用cygwin编译链接生成动态库:
我们使用cygwin来在window下模拟一个linux环境进行动态库的生成操作。
我们将jni文件夹copy到下载后解压的ndk的根目录下
然后在cygwin的终端界面进入到jni目录下,使用ndk-build指令 ,如下图所示 :
然后我们发现在ndk的根目录下生成了一个文件夹libs, 打开后是一个文件夹armeabi,在该文件夹下就生成了我们所需要的动态库——libhelloAndroidNDK.so 。
然后我们就可以在android项目中来使用这个so包了 。
注意事项 :
在cygwin中使用 ndk-build 失败,如果不是代码问题(或者提示make出错),可能是你的cygwin没有安装make工具 ,可以重新打开cygwin的安装包,然后在选择安装工具的界面
中输入make进行搜索然后进行安装。
关于makefile这里只是简要的说明了一下 。
参考:
主要参考资料 NDK的官方文档 ,官方文档中对于NDK工具的整个使用过程进行了详细介绍,在NDK的sample文件夹下
可以找到很多学习的代码 。
0 0
- Android NDK : 自己动手做so库
- cocos2dx android ndk 加载动态库(.so)
- Android NDK开发生成.so/.a库
- android ndk jni so库生成
- android ndk 生成so
- Android NDK 编译SO
- NDK编译.so库
- ndk 调试so库
- [Android]自己动手做个拼图游戏
- [Android]自己动手做个拼图游戏
- [Android]自己动手做个拼图游戏
- [Android]自己动手做个拼图游戏
- Android NDK生成so文件
- Android-NDK编译.so文件
- [Android NDK]自己动手实现TestJni
- Ubuntu+旧版android ndk生成so库文件
- Android NDK中重新编译已有so库!
- Android Studio 添加C库so文件方法(NDK开发)
- leetcode343 Integer Break java
- C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
- poj 2513 无向图欧拉路+Trie
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- 错误信息:Address already in use: connect
- Android NDK : 自己动手做so库
- leetCode_Flatten Binary Tree to Linked List
- 1.APP后端开发系列:登陆系统设计中的注意问题
- Java编程中操作XML文件(解析方法一:DOM)
- verilog编程风格(说明/参数/IO/语句/缩进)
- 传递一个Parcelable正常,传递两个Null
- android 画布 canvas 日记
- UML的使用
- cf 689 D(线段树+二分)