Android Studio 第一个JNI程序
转自:https://github.com/jeanboydev/Android-JNITest
1.介绍
Android Studio + NDK来实现JNI。
什么是NDK与JNI技术?
NDK:Native Development Kit
The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++.(谷歌官方文档)
大致意思:NDK是一个工具,可以让你实现你的应用程序使用本地代码的语言,如C和C++的部分。
JNI:Java Native Interface
它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
准备工作
- 1.搭建好Android Studio开发环境。
- 2.新建一个Android项目
Android Studio配置NDK
1.如图所示下载LLDB+NDK并安装。
2.配置安装好的NDK路径。
3.配置一些快捷方式。
javah 用于生成头文件Program:$JDKPath$/bin/javah注意:这个命令我加上了-encoding UTF-8指定编码,你可以改成你工程的编码。Parameters:-encoding UTF-8 -d ../jni -jni $FileClass$Working directory:$SourcepathEntry$\..\javandk-build 用于构建so包注意:MAC/Linux用ndk-build,没有.cmd后缀Program:C:\Develop\Android\sdk\ndk-bundle\ndk-build.cmdParameters:什么都不用填Working directory:$ModuleFileDir$\src\mainndk-build clean 清除so包注意:MAC/Linux用ndk-build,没有.cmd后缀Program:C:\Develop\Android\sdk\ndk-bundle\ndk-build.cmdParameters:cleanWorking directory:$ModuleFileDir$\src\main
配置项目
- 在gradle.properties文件中添加
android.useDeprecatedNdk=true
修改文件目录如下
参考Android Studio Project Site
1.修改根目录下的build.gradle
buildscript {repositories {jcenter()}dependencies {// 修改build:gradle为build:gradle-experimentalclasspath "com.android.tools.build:gradle-experimental:0.7.0"// classpath 'com.android.tools.build:gradle:2.1.2'}}allprojects {repositories {jcenter()}}//添加task clean(type: Delete) {delete rootProject.buildDir}
- 2.修改gradle->wrapper->gradle-wrapper.properties
#Mon Dec 28 10:00:20 PST 2015distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip//修改这里的版本号
gradle-experimental与gradle-wrapper相对应的版本号如下图
3.修改app->build.gradle
修改之前的apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "23.0.3"defaultConfig {applicationId "com.jeanboy.demo.jnitest"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:23.4.0'}
修改之后的apply plugin: 'com.android.model.application'//修改//apply plugin: 'com.android.application'model {//修改android {compileSdkVersion 23buildToolsVersion "23.0.3"defaultConfig {applicationId "com.jeanboy.demo.jnitest"minSdkVersion.apiLevel 15targetSdkVersion.apiLevel 23versionCode 1versionName "1.0"}ndk {//指定生成的lib,比如此时生成native.somoduleName "NdkTest"}buildTypes {release {minifyEnabled falseproguardFiles.add(file("proguard-rules.pro"))//修改}}}}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:23.4.0'}
4.创建jni文件夹
5.创建NdkTest.java
public class NdkTest {static {System.loadLibrary("NdkTest");//加载要使用的so文件}//生命native方法public static native String getString();public static native int doAdd(int param1,int param2);}
- 6.生成NdkTest.h并创建NdkTest.cpp实现NdkTest.h中的native方法
NdkTest.h文件内容
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_jeanboy_demo_jnitest_NdkTest */#ifndef _Included_com_jeanboy_demo_jnitest_NdkTest#define _Included_com_jeanboy_demo_jnitest_NdkTest#ifdef __cplusplusextern "C" {#endif/* * Class: com_jeanboy_demo_jnitest_NdkTest * Method: getString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_getString(JNIEnv *, jclass);//待实现的native方法/* * Class: com_jeanboy_demo_jnitest_NdkTest * Method: doAdd * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_doAdd(JNIEnv *, jclass, jint, jint);//待实现的native方法#ifdef __cplusplus}#endif#endif
NdkTest.cpp文件内容
#include "com_jeanboy_demo_jnitest_NdkTest.h"JNIEXPORT jstring JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_getString(JNIEnv *env, jclass type) {//具体实现return env->NewStringUTF("hello world!!!");}/* * Class: com_jeanboy_demo_jnitest_NdkTest * Method: doAdd * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_jeanboy_demo_jnitest_NdkTest_doAdd(JNIEnv *env, jclass type, jint param1, jint param2) {//具体实现return param1 + param1;}
- 7.在jni文件夹下创建Android.mk和Application.mk
Android.mk文件内容
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := NdkTest//moduleNameLOCAL_SRC_FILES := NdkTest.cpp//上面创建的NdkTest.cppinclude $(BUILD_SHARED_LIBRARY)
Application.mk文件内容
APP_MODULES := NdkTest/*这个变量是可选的,如果没有定义,NDK将由在Android.mk中声明的默认的模块编译,并且包含所有的子文件(makefile文件); 如果APP_MODULES定义了,它不许是一个空格分隔的模块列表,这个模块名字被定义在Android.mk文件中的LOCAL_MODULE中。 注意NDK会自动计算模块的依赖*/APP_ABI := all//支持所有平台,也可以指定平台空格隔开armeabi armeabi-v7a x86
Android系统目前支持的CPU架构:ARMv5,ARMv7 (从2010年起)x86 (从2011年起)MIPS (从2012年起)ARMv8,MIPS64和x86_64 (从2014年起)每一个CPU架构对应一个ABICPU架构 ABIARMv5 ---> armeabiARMv7 ---> armeabi-v7ax86 ---> x86MIPS ---> mipsARMv8 ---> arm64-v8aMIPS64 ---> mips64x86_64 ---> x86_64armeabi:默认选项,将创建以基于ARM* v5TE 的设备为目标的库。 具有这种目标的浮点运算使用软件浮点运算。 使用此ABI(二进制接口)创建的二进制代码将可以在所有 ARM*设备上运行。所以armeabi通用性很强。但是速度慢armeabi-v7a:创建支持基于ARM* v7 的设备的库,并将使用硬件FPU指令。armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu。mips:MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。x86:支持基于硬件的浮点运算的IA-32 指令集。x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小。总结如果项目只包含了 armeabi,那么在所有Android设备都可以运行;如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行; 如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的;如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
8.生成so文件
9.在需要native方法的地方直接调用
NdkTest.getString();NdkTest.doAdd(5, 12);
- 10.运行app试试效果吧
Android Studio 第一个JNI程序相关推荐
- Android Studio第一个NDK程序
原址 由于最近比较有空,特地记录一下之前学习Android Studio NDK环境部署的过程,以免以后忘记. 开发环境: Window 10 Android Studio 2.0 1.在Androi ...
- Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...
- android studio 单步调试jni,android studio实现Jni单步调试-标准配置教程
本文主要介绍在android studio下实现jni单步调试时,所需要的配置及其步骤,这些也是本人经过几天折腾慢慢实现的,先提供给大家做参考: 1,配置是在mac下android studio实现的 ...
- 使用Android Studio编写一个简单的音乐盒
文章目录 一.知识要点 二.xml代码 activity_main.xml 三.java代码 MainActivity.java MusicService.java 四.运行界面展示 五. 源码Git ...
- android app启动图片 加动画效果,Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案...
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案 大家在设计APP的末期,都会想给APP搞一些"花里胡哨"的特效来提高APP的B格.博主表示亲测有效 ...
- 如何使用android studio制作一个阿里云物联网APP
摘要:要想学会物联网技术,需要掌握的知识真的有太多了,其中一个关键的技能,也是决定物联网技能等级的,就是移动端开发能力.当然,现在有很多平台都提供了各种各样的移动端应用,但是都相对封闭,我们无法掌握其 ...
- 在Android Studio中运行Java程序
在Android Studio中运行Java程序 有时候在开发Android时,由于调试需要,需要写一些Java程序. 由于类库引用等问题,去IntelliJ IDEA新建一个Java程序还要添加类库 ...
- Android Studio执行出现“应用程序安装异常(-15)
Android Studio执行出现"应用程序安装异常(-15) gradle.propeities文件,在最底下加入: android.injected.testOnly=false 我的 ...
- Android Studio在类微信程序完成“蓝牙聊天功能”实现蓝牙通信
Android Studio在类微信程序完成"蓝牙聊天功能"实现蓝牙通信 项目运行截图 通信原理 蓝牙权限 strings.xml tab01.xml 菜单文件option_men ...
最新文章
- 颠覆认知:SRE 到底是干啥的?
- 网络营销外包——网络营销外包专员浅析提升用户体验从哪入手?
- 打印dataframe的前十行_小学生之十行Python解高思五星题(一)
- sharepoint Lists Web service 用法
- YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】
- Couchbase 2.0归类视图简介
- 悲观锁和乐观锁_面试必备之乐观锁与悲观锁
- linux top 命令可视化_Linux 使用 top 命令查看系统的运行情况
- 《你不常用的c#之二》:略谈GCHandle
- python程序设计遇到的问题_Python程序设计与实践:用计算思维解决问题
- ansible-playbook之循环(Loops)
- NIS企业级应用案例-统一Linux和Windows身份验证(二)
- FFmpeg源代码简单分析-通用-结构体分析-AVCodec
- 2022蓝帽杯半决赛电子取证
- 智能机器人建房子后房价走势_机器人建楼、5G住宅……房地产下半场要这样玩...
- 单耳蓝牙耳机怎么连接_蓝牙耳机怎么连接
- java连接mongo数据库,并执行db.runCommand命令
- php解决时间2038问题,PHP实例:关于PHP转换超过2038年日期出错的问题解决
- 【深度学习】ReID相关知识点解析(PCB、BoT、MGN)
- couldnotfindartifactcom.orcale:ojdbc6:pom:11.2.0.1.0innexus-aliyun