Android Studio jni开发入门——看我就够了!

简介:

本文记录一下Android Studio 进行jni开发的基础配置以及入门教程,想当初使用eclipse配置ndk环境都难,现在基本都向AS转型,特此给需要帮助的新手村的同学们少走弯路

一、环境配置

主要需要配置的就是NDK(Native Development Kit),现在Android studio很便利,可以一键下载: file → setting → 按截图找到如下路径 → 选择NDK → 确定应用下载 

安装完成以后就可以开撸了

二、jni hello world!

1. 新建一个项目

新建一个app,测试jni开发  

2.设置支持jni

打开gradle.properties,添加:


  
  
  1. android.useDeprecatedNdk=true 

打开local.properties,添加:


  
  
  1. ndk.dir=NDK的路径 

最后打开app内build.gradle,在android/defaultConfig下面添加ndk配置


  
  
  1. apply plugin: 'com.android.application' 
  2.  
  3. android { 
  4.  
  5.     compileSdkVersion 25 
  6.  
  7.     buildToolsVersion "25.0.0" 
  8.  
  9.     defaultConfig { 
  10.  
  11.         applicationId "com.lilei.testjni" 
  12.  
  13.         minSdkVersion 15 
  14.  
  15.         targetSdkVersion 25 
  16.  
  17.         versionCode 1 
  18.  
  19.         versionName "1.0" 
  20.  
  21.         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
  22.  
  23.         ndk { 
  24.  
  25.             moduleName "JNISample" 
  26.  
  27.         } 
  28.  
  29.     } 
  30.  
  31.     buildTypes { 
  32.  
  33.         release { 
  34.  
  35.             minifyEnabled false 
  36.  
  37.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
  38.  
  39.         } 
  40.  
  41.     } 
  42.  
  43.  
  44. dependencies { 
  45.  
  46.     compile fileTree(dir: 'libs', include: ['*.jar']) 
  47.  
  48.     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
  49.  
  50.         exclude group'com.android.support', module: 'support-annotations' 
  51.  
  52.     }) 
  53.  
  54.     compile 'com.android.support:appcompat-v7:25.3.1' 
  55.  
  56.     compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8' 
  57.  
  58.     testCompile 'junit:junit:4.12' 
  59.  

moduleName 表示编译出的so文件的名字

3.新建java访问c层的接口类

创建一个Jni的工具类,并定义接口函数,函数关键字用native(static用不用均可)


  
  
  1. package com.lilei.testjni; 
  2.  
  3. /** 
  4.  
  5.  * Created by lilei on 2017/3/29. 
  6.  
  7.  */ 
  8.  
  9. public class JniUtils { 
  10.  
  11.     public static native String getJniString(); 
  12.  

getJniString()方法即要与C层的交互的函数

4.生成头文件

"make-project"编译完成

打开终端,运行

运行成功之后打开app/build/intermediates/classes/debug/ 即可找到编译出的头文件"com_lilei_testjni_JniUtils.h",不难发现头文件名是有原报名+类名组成 

 


  
  
  1. cd app/build/intermediates/classes/debug/ 
  2.  
  3. javah com.lilei.testjni.JniUtils 

5.创建jni开发的文件夹

点击app文件夹,New → Folder → JNI Folder, 选择在main文件夹下即可,生成成功后main目录下会出现一个jni的文件夹

找到刚才生成到头文件,复制到jni文件夹下(记得关闭刚才使用的终端,否则无法复制)

头文件有了,现在在jni目录下创建一个C++文件用于开发使用,命名与头文件相同

编写C++文件中定义函数的代码


  
  
  1. #include "com_lilei_testjni_JniUtils.h" 
  2.  
  3. JNIEXPORT jstring JNICALL Java_com_lilei_testjni_JniUtils_getJniString 
  4.  
  5.         (JNIEnv *env, jclass) { 
  6.  
  7.     // new 一个字符串,返回Hello World 
  8.  
  9.     return env -> NewStringUTF("Hello World"); 
  10.  

6.java层加载so

回到JniUtils,加上 

 


  
  
  1. static { 
  2.  
  3. System.loadLibrary("JNISample"); 
  4.  

7.运行Run

调用jni的函数


  
  
  1. package com.lilei.testjni; 
  2.  
  3. import android.support.v7.app.AppCompatActivity; 
  4.  
  5. import android.os.Bundle; 
  6.  
  7. import android.util.Log; 
  8.  
  9. public class MainActivity extends AppCompatActivity { 
  10.  
  11.     @Override 
  12.  
  13.     protected void onCreate(Bundle savedInstanceState) { 
  14.  
  15.         super.onCreate(savedInstanceState); 
  16.  
  17.         setContentView(R.layout.activity_main); 
  18.  
  19.         Log.i("Jni", JniUtils.getJniString()); 
  20.  
  21.     } 
  22.  

至此就成功运行出jni的Hello World了 

三、生成so文件

前文介绍如何运行C++程序,但是实际开发中大多是封装编译出so文件后进行开发,就类似java里面的jar包

1.配置NDK环境变量

找到Android Studio安装的NDK包的文件目录(E:AndroidStudioSDKSDKndk-bundle),添加到系统的环境变量中

2.新建mk文件

在jni目录下新建Android.mk


  
  
  1. LOCAL_PATH := $(call my-dir) 
  2.  
  3. include $(CLEAR_VARS) 
  4.  
  5. LOCAL_MODULE := JNISample 
  6.  
  7. LOCAL_SRC_FILES := com_lilei_testjni_JniUtils.cpp 
  8.  
  9. include $(BUILD_SHARED_LIBRARY) 

在jni目录下新建Application.mk文件


  
  
  1. APP_STL := gnustl_static 
  2.  
  3. APP_CPPFLAGS := -frtti -fexceptions -std=c++0x 
  4.  
  5. APP_ABI := armeabi-v7a 
  6.  
  7. APP_PLATFORM := android-18 

3.编译生成so

打开终端cd到jni目录下

调用ndk-build开始编译so


  
  
  1. ndk-build 

运行无误的话会如图所示

运行成功之后即会看到main文件夹下多了libs和obj的文件夹,里面就是生成的各种CPU的so文件

libs和obj里面都有so文件,两者的区别google给出的解释是: As part of the build process, the files in the libs folder have been stripped of symbols and debugging information. So you'll want to keep two copies of each of your .so files: One from the libs folder to install on the Android device, and one from the obj folder to install for GDB to get symbols from. 也就是说,libs目录下生成的库是剥离了符号表与调试信息的,而obj下的库是带有调试信息的。

至此jni的开发入门已完成





本文作者:佚名
来源:51CTO
目录
相关文章
|
10天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
15天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
17天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
19天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
17天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
18天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
26 2
|
19天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
26天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
25天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
32 5
|
23天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!