博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)
阅读量:5115 次
发布时间:2019-06-13

本文共 3476 字,大约阅读时间需要 11 分钟。

版权声明:本文为博主原创文章,未经博主同意不得转载。 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 
#include
jstringJava_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"#endif return (*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项目名.soLOCAL_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项目名.soLOCAL_MODULE    := hello-jni#要编译的c or cpp文件,注意不须要在这里列举头文件或者include的文件,构建系统会自己主动帮你依赖这些文件LOCAL_SRC_FILES := hello-jni.c#构建系统提供的变量include $(BUILD_SHARED_LIBRARY)#对nick文件夹下的代码打包soinclude $(CLEAR_VARS)LOCAL_MODULE    := hello-jni-mineLOCAL_SRC_FILES := nick/hello-jni.cinclude $(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

你可能感兴趣的文章
Java泛型的基本使用
查看>>
1076 Wifi密码 (15 分)
查看>>
rsync
查看>>
noip模拟赛 党
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Java反射机制及其Class类浅析
查看>>
Postman-----如何导入和导出
查看>>
移动设备显示尺寸大全 CSS3媒体查询
查看>>
hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)
查看>>
图片等比例缩放及图片上下剧中
查看>>
WebView加载网页详情
查看>>
【转载】Linux screen 命令详解
查看>>
dd命令 建立两颗一模一样的磁盘
查看>>
常用的jquery触屏手机页面特效代码下载
查看>>
background-clip,background-origin
查看>>
C# 如何创建一个Windows服务
查看>>
集群和分布式区别
查看>>
Android(java)学习笔记153:采用post请求提交数据到服务器(qq登录案例)
查看>>
Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
查看>>
Android 高级UI设计笔记12:ImageSwitcher图片切换器
查看>>