版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/wangbin_jxust/article/details/37389383

之前在进行cocos2dx开发时。已经具体介绍了怎样将win32的c++代码移植到Android平台。当再次回想时,发现一些基础的东西理解并非非常彻底。今天使用Android NDK提供的一个样例做一个简单的移植。

在进行该demo前。请确认你已经配置了Android开发环境和安装了最新的Android NDK。

1.创建Android项目

创建一个Android项目 , 包名是com.example.hellojni。创建一个Activity作为程序进入的Acitivity。命名为HelloJni。

2.创建 C 文件

创建一个C文件,放一个函数。该函数的作用是获取当前cpu架构并以字符串的形式返回。

请注意该函数的格式: Java_包名的下划线连接_Java文件名称_java函数名。

#include <string.h>
#include <jni.h>jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,jobject thiz )
{
#if defined(__arm__)#if defined(__ARM_ARCH_7A__)#if defined(__ARM_NEON__)#define ABI "armeabi-v7a/NEON"#else#define ABI "armeabi-v7a"#endif#else#define ABI "armeabi"#endif
#elif defined(__i386__)#define ABI "x86"
#elif defined(__mips__)#define ABI "mips"
#else#define ABI "unknown"
#endifreturn (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
}

3.配置JNI

在该Android项目的根文件夹(即AndroidManifest.xml文件所在文件夹)下创建一个文件夹,命名为jni(注意,文件名称不能写错哦)

在jni文件夹下,创建Android.mk和Application.mk两个文件。同一时候将C文件也放进jni文件夹以下来。

例如以下:

这里的nick文件夹,能够先忽略不看。这是为后面的打包多个so准备的。

a.配置Android.mk文件

Android.mk文件实际上一个非常小的NDK构建脚本,它的语法在: NDK安装文件夹/docs/ANDROID-MK.html,下文代码也对一些基本属性加入了凝视。

#返回当前文件在系统中的路径,mk文件開始时必须定义该变量
LOCAL_PATH := $(call my-dir)#CLEAR_VARS 变量由构建系统提供,由于有大量的全局变量,在本次构建前,清除上一次的
include $(CLEAR_VARS)
#LOCAL_MODULE 实际是项目名,用于区分各个项目。名字必须是唯一的并且不包括空格,终于的so库,命名也会是   lib项目名.so
LOCAL_MODULE    := hello-jni
#要编译的c or cpp文件,注意不须要在这里列举头文件或者include的文件,构建系统会自己主动帮你依赖这些文件
LOCAL_SRC_FILES := hello-jni.c
#构建系统提供的变量
include $(BUILD_SHARED_LIBRARY)

b.配置Application.mk文件

Application.mk文件实际上是相应用程序本身描写叙述的文件,它定义了应用程序须要的功能模块的列表、针对不同cpu架构打包不同的so]、要构建release或者debug包等。

APP_ABI := XXX,这里的XXX就是指不同的平台,能够选填的有x86,armeabi,armeabi-v7a,mips,all,值得一提的是,选择all,则会构建出全部平台的so,假设不填该项,默认构建为armeabi的。同一时候。作者也做过一个实验,构建armeabi平台的so是能够执行在intel x86架构cpu平台的。可是构建x86平台的so则不能在armeabi平台上执行的。这样看来。应该是intel针对armeabi做了兼容,可是假设想要so 以最小的能耗执行在intel x86平台。还是要指定构建的so为x86平台。

4.打包so以及怎样打包多个so

在当前Android项目的根文件夹下,执行 NDK安装路径/ndk-build,则開始打包so。

另外,假设执行    NDK安装路径/ndk-build clean,会clean当前全部的so;

执行 NDK安装路径/ndk-build -B V=1,则强制又一次打包。

假设想要打包多个so。则能够在Android.mk定义多个modules。或者写多个Android.mk,每一个Android.mk定义一个modules,我这里在jni文件夹下又创建了一个nick文件夹,用于放置新的C文件。

此时,仅仅须要修改jni文件夹下的Android.mk,再次对nick文件夹的C代码打包就可以。jni下的Android.mk文件:

#返回当前文件在系统中的路径,mk文件開始时必须定义该变量
LOCAL_PATH := $(call my-dir)#CLEAR_VARS 变量由构建系统提供,由于有大量的全局变量,在本次构建前。清除上一次的
include $(CLEAR_VARS)
#LOCAL_MODULE 实际是项目名,用于区分各个项目,名字必须是唯一的并且不包括空格,终于的so库。命名也会是   lib项目名.so
LOCAL_MODULE    := hello-jni
#要编译的c or cpp文件,注意不须要在这里列举头文件或者include的文件,构建系统会自己主动帮你依赖这些文件
LOCAL_SRC_FILES := hello-jni.c
#构建系统提供的变量
include $(BUILD_SHARED_LIBRARY)#对nick文件夹下的代码打包so
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni-mine
LOCAL_SRC_FILES := nick/hello-jni.c
include $(BUILD_SHARED_LIBRARY)

是的,你没看错,又一次加上LOCAL_MODULE和LOCAL_SRC_FILES变量又一次配置一下就可以。

5.jni调用

在Activity中。我们使用static 关键词将载入so放在函数体中,以保证直接先载入so.

static {System.loadLibrary("hello-jni");}

要注意的是。System.loadLibrary()中填写的并非完整的so名。而是去掉前缀lib和后缀.so的。也就是Android.mk中的LOCAL_MODULE变量。

java层的函数要用native关键词声明这次调用native层的函数,假设该java函数是public native String  XXXX(),那么在这里就是调用C代码中的Java_com_example_hellojni_HelloJni_stringFromJNI()函数。

以上就是Android平台打包so和调用的一个最主要的demo,事实上整个流程还是比較简单的,有一些规定的命名是不能随便修改的,假设jni文件夹名。Android.mk,Application.mk文件名称,被java层调用的C函数命名等,这些都是有规则的。

转载于:https://www.cnblogs.com/xfgnongmin/p/10679337.html

两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)相关推荐

  1. 两分钟学会用ADC0804采集数据

    两分钟学会用ADC0804采集数据 ADC分辨以输出二进制的位数表示.从理论上讲,n位输出的ADC能区分2n2^n2n个不同的级别的输入模拟电压,能区分输入电压的最小值为满量程输入的1/2n1/2^n ...

  2. 如何使用录音转文字助手?免费教程来袭!两分钟学会!

    如何使用录音转文字助手?免费教程来袭!两分钟学会! 目前使用手机用户正在飞速的增长,手机越来越能够方便我们的日常生活,对于手机上的语音助手功能,我想大家应该也是一直在使用的,并且有的手机还带有语音翻译 ...

  3. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---4

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...

  4. android studio关于命令行打包apk

    前言: 最近刚接触studio,由于项目需要打包apk,就尝试用命令行来进行打包.下面做一下总结: 第一:需要在studio项目中配置 signingConfigs { config { keyAli ...

  5. android命令行打包、签名+自动打包器

    本文主要讲解使用命令行打包android工程成apk文件,我的android工程结构如图 1.创建key: 使用keytool.exe(位于%JAVA_HOME%\bin\keytool.exe)创建 ...

  6. ​第一本 Compose 图书上市,联想大咖教你学会 Android 全新 UI 编程

    朱江 | 现任联想(北京)有限公司 Android 开发工程师,从事 Android 开发工作多年,有丰富的项目经验,负责和参与开发过多款移动应用程序,同时还是多个开源项目的作者.2017 年开始在 ...

  7. android平台蓝牙编程

    原文:http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样 ...

  8. 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )

    文章目录 一.Visual Studio 中创建 Makefile 项目 二.配置 Makefile 文件 三.配置 Android.mk 四.配置 Application.mk 五.主函数源码 六. ...

  9. android 环境配置和安装, Android系统包说明,基本控件,常用代码,ADB 命令行,APK文件确解,小技艺,...

    一.             环境配置和安装(Android2.2) 参考文章:这里 1.1     JDK 1.2     SDK 下载地址:http://dl.google.com/android ...

最新文章

  1. Web Farm Web Garden
  2. yii2 postman 文件上传
  3. nc——制作后门连接与反弹shell连接的使用
  4. JQuery七个常犯的错误
  5. java 字符串倍_java字符串拼接与性能分析详解
  6. android 富文本编辑器_富文本编辑器,还是Tinymce好一点?Angular/Vue集成最新版
  7. java同类型同字段名称对象赋值
  8. qt读oracle时间戳,QT解析时间戳与微秒级精度
  9. CodeForces 780B ——The Meeting Place Cannot Be Changed(二分法)
  10. 从程序设计方法学的角度比较 SP 方法与OOP 方法
  11. C#随机生成信用卡卡号的源码
  12. 【Eclipse使用教程】Java导包快捷键
  13. 高级计算机程序员实操题,国家计算机软考高级程序员历年真题1990.doc
  14. Levels - 虚幻引擎场景制作
  15. 可发教育类论文的期刊《家长》简介及投稿邮箱
  16. 理解事务四大特性(Transaction)——原子性、一致性、隔离性和持久性(ACID)
  17. 解读中国版存款保险制度:差别费率+强监管色彩
  18. 大三上期末复习(网络安全物联网概论安全协议软件工程)
  19. 国芯方案——胎压计芯片方案SIC8632
  20. PCIE内核注册详解

热门文章

  1. string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库
  2. mac的 上传到linux服务器地址,【mac 怎么登录到 linux 服务器并传输文件?】-看准网...
  3. python安装和更新pip
  4. 鼠标控制程序,按住shift显示S,按住Ctrl显示C,按键盘显示D,松开键盘显示U
  5. oracle数据库基础知识总结,oracle数据库基础知识学习笔记
  6. AI学习笔记(十一)CNN之图像识别(上)
  7. s信网页版rver定时任务mysql_DataX Web2.0发布,集成定时任务,支持分布式
  8. 根号x_【深情攻X自卑受】糖与盐by根号三
  9. 百度开源的依存句法分析系统
  10. 基于python+opencv的图像目标区域自动提取