Android培训
美国上市Android培训机构

400-111-8989

热门课程

Android Studio jni开发配置,Android Studio jni开发调试教程

  • 时间:2017-04-26
  • 发布:Android培训
  • 来源:Android教程

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

一、环境配置

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

Android Studio jni开发

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

二、jni hello world!

1. 新建一个项目

新建一个app,测试jni开发  

Android Studio 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",不难发现头文件名是有原报名+类名组成 

Android Studio jni开发 

  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,加上 

Android Studio jni开发 

  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了 

Android Studio jni开发

三、生成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 

运行无误的话会如图所示

Android Studio jni开发

运行成功之后即会看到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的开发入门已完成

上一篇:Android Studio2.2安装图文教程
下一篇:Android 开发实践经验,让你少走弯路

Android中基于回调的事件处理

Android系统事件的响应教程

如何利用Sanitizer解决Android开发中遇到的Bug?

Android开发中基于监听的事件处理

选择城市和中心
贵州省

广西省

海南省

台湾