android studio ndk-build 编译C生成.so文件(ndk基础篇

本文转自:你我学习网: https://www.niwoxuexi.com/blog/android/article/246.html

一、概要

最近项目需要,要把代码中加密的部分打包成so文件,刚开始接触的时候真是痛苦呀,网上好多资料,都不是很详细,步骤也不清晰,所以我整理了一下,希望大家喜欢。

现在android studio打包so文件有两种方式,第一种是ndk-build编译项目,还有一种用CMake脚本构建项目,今天主要介绍ndk-build的编译过程

二、ndk-build 构建过程

1,下载NDK和构建工具

正所谓:“工欲善其事必先利其器”,我们今天的主要工具是Android Studio2.3版本,至于 Android Studio环境搭建,sdk,jdk什么的,你们自己去弄,这里主要是讲解ndk编译c语言的配置。

为您的应用编译和调试原生代码,您需要以下组件:

  • Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。
  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
  • LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

您可以使用 SDK 管理器安装这些组件:

  1. 在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager(或者在顶部工具栏中直接点击SDK Manager, 下图的标记就是从这里点击的)
  2. 点击 SDK Tools 标签。
  3. 选中 LLDBCMake 和 NDK 旁的复选框,如图 1 所
  4. 点击 Apply,然后在弹出式对话框中点击 OK
  5. 安装完成后,点击 Finish,然后点击 OK

SDK环境配置:

提前新建一个测试用的项目 NdkDemo

  1. 切换到Project工程目录,打开Project Structure (方法一,直接在工具栏打开,如下图所示,方法二, 右键工程目录 -> Open Module Settings)
  2. 选择左边栏 SDK Location
  3. 在Android NDK Location 位置,选择 ndk安装包的路径,一般放在sdk目录下(下图是我mac系统放置ndk的路径,windows系统也类似,大家自己选择)
  4. 点击 OK
  5. 为最外层工程目录下的gradle.properties的文件末尾加上android.useDeprecatedNdk=true这段代码(如果没有这个目录,自己新建一个),如下图所示:

Ok,上面我们把环境给配置好了,下面我们就可以写Java和C代码了

2,Java代码和C代码的编写过程

1,首先新建一个java类JNIUtils.java,代码如下

public class JNIUtils {
    // 加载native-jni
    static {
        System.loadLibrary("native-jni");
    }
    //java调C中的方法都需要用native声明且方法名必须和c的方法名一样
    public native String stringFromJNI();
}

2,重新Make Project一下工程如下图2-1,完成后会在工程目录 ... /NdkDemo/app/build/intermediates/classes/debug/com/niwoxuexi/ndkdemo 看到自己编译后的classes文件JNIUtils.class如下图2-2所示:

图:2-1

图:2-2

3,用javah工具生成头文件

1) 首先新建一个java类JNIUtils.java,

2) 代码在studio打开Terminal命令行工具,打开步骤是View->Tool Windows->Terminal (或者在下边的工具栏中直接打开或直接按Alt+F12)

在命令行中先进入到工程的main目录下

3) 输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径

例如:

javah -d jni -classpath /Users/zhuxiaocheng/android/workspace/NdkDemo/app/build/intermediates/classes/debug com.niwoxuexi.ndkkemo.JNIUtils

注意: 1, debug后的空格

2, windows 系统路径中的文件的分割线是 '\' 而不是mac系统的 '/' 


4)按回车之后就会在main目录下生成jni文件夹,同时生成.h文件 如下图所示

5) 现在我们在jni目录下新建一个 native-lib.c 的 c 文件,内容如下

//
// Created by 朱孝诚 on 2017/8/30.
//
#include "com_niwoxuexi_ndkdemo_JNIUtils.h"
/**
 * 上边的引用标签一定是.h的文件名家后缀,方法名一定要和.h文件中的方法名称一样
 */
JNIEXPORT jstring JNICALL Java_com_niwoxuexi_ndkdemo_JNIUtils_stringFromJNI
        (JNIEnv *env, jobject ojb){
    return (*env) -> NewStringUTF(env,"Hello, I'm from jni");
}

6)会后在app的build.gradle配置文件中添加如下代码:

//ndk编译生成.so文件
ndk {
    moduleName "native-lib"         //生成的so名字
    abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。
}

如图所示:

7) 最后在我们来测试一下,只需要在MainActivity中调用一下C就可以了,代码如下:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.text);
        textView.setText(new JNIUtils().stringFromJNI());
    }
}

8) 直接运行项目,结果如下所示:

ok,没问题,可以调用,其实也没有想象中的那么难。

代码地址:https://image.niwoxuexi.com/blog/download/NdkDemo.zip

三、调用编译过的 .so 库

上边编译完成了,有人会问:我要的是编译后的.so库,别人用的时候直接拿来用就可以了,那编译后的.so库在哪呢?不要着急,请看下图:

根据这个路径就可以找到指定输出的三种体系结构下的.so库文件,然后把.so文件复制出来,如下图所示的放到相应libs的文件夹,

1, 把复制的so包,放到项目的libs目录下

2, 在app module 下的buide.gradle 中添加下面代码:

//放在libs目录中
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
   }
}

如图所示:

ok, 这样就可以了

四、总结

也没什么好总结的,直接按照上面步骤一步一步来,就可以了,jni调用过程有什么问题,欢迎留言!

最后是贴上代码地址:https://image.niwoxuexi.com/blog/download/NdkDemo%202.zip

时间: 2024-11-03 02:59:25

android studio ndk-build 编译C生成.so文件(ndk基础篇的相关文章

api-Android studio在build的时候经常R文件丢失

问题描述 Android studio在build的时候经常R文件丢失 错误如图: 当build完之后就会出现下面的错误 补充说明:AS重新卸载安装过,SDK也重新全部安装,除了API比较小的两个,和一些穿戴式,和Google play的SDK没下载,其它全部都是已安装的了:rebuild和clean都试过,没有用 这个问题困扰了两天了,求大神解救,感激不尽~~ 解决方案 试一下 手动把build文件夹,删除,再重新build一下 解决方案二: 工程没错吗?若有错,先排错.若没错那就奇怪了. 解

Android Studio 超级简单的打包生成apk的方法

本文介绍了Android Studio 超级简单的打包生成apk,分享给大家,也给自己留个笔记. 为什么要打包: apk文件就是一个包,打包就是要生成apk文件,有了apk别人才能安装使用.打包分debug版和release包,通常所说的打包指生成release版的apk,release版的apk会比debug版的小,release版的还会进行混淆和用自己的keystore签名,以防止别人反编译后重新打包替换你的应用. 简单点说就是给你的apk发身份证,上户口,防止和你长的一样的人,假冒你.这里

Android Studio 中 build.gradle 中 dependencies 下的 comile 后面的内容的来源

Android Studio 中 build.gradle 中 dependencies 下的 comile 后面的内容的来源 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.0' 答案来自于:http://mvnrepository.com/ 你知道的名字应该是 rxandroid,而它依赖 rxjava,如果你想使用 rxjava 的最新版本,而不是 rxandro

控件-android studio 创建blank activity时生成content_main.xml

问题描述 android studio 创建blank activity时生成content_main.xml 为什么创建按blank activity的时候会自动生成content_main.xml,而且只有content_main.xml能往上拖控件,而activity_main.xml却不能往上面拖控件 解决方案 如果出现这种情况的话:activity_main_xml 是控制整个xml布局的情况 而content_main_xml是控制xml里面的内容的 在activity_main_x

Android studio 使用Debugger问题(代码中含有ndk)

NDK NDK 是 Native Developmentit的缩写,是Google在Android开发中提供的一套用于快速创建native工程的一个工具. 使用这个工具可以很方便的编写和调试JNI的代码. NDK可从官网或AndroidDevTools(个人网站)下载. 1.出现错误: Error running app: Unable to open debugger port (localhost:8601): java.net.ConnectException "Connection re

android studio-如何将Android Studio 中的项目打包成jar文件,求方法

问题描述 如何将Android Studio 中的项目打包成jar文件,求方法 如题,求能用的方法,试了好多百度的方法,不怎么好用啊,越详细越好 解决方案 AS 生成Jar包 在Gradle中添加任务声明 def makeJar(String target, String classDir) { exec { executable "jar" //调用jar args "cvf", target args "-C", classDir args

Android Studio(九):引用jar及so文件

Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Android Studio编码 Android Studio(四):Android Studio集成Genymotion Android Studio(五):修改Android Studio项目包名 Android Studio(六):Android Studio添加注释模板 Android Studio

我的android studio总是不能够创建app-debug.apk文件?

问题描述 我的android studio总是不能够创建app-debug.apk文件? 错误: Gradle build finished with 1 error(s) in 33 sec Unexpected Error Local path doesn't exist. Local path doesn't exist. The project may need to be synced with Gradle files. 找到的办法:sdktoolslibfind_java.bat

android开发-如何用Android Studio将源码打包成AAR文件,并且AAR文件中包含源码

问题描述 如何用Android Studio将源码打包成AAR文件,并且AAR文件中包含源码 如何用Android Studio将源码打包成AAR文件,并且AAR文件中包含源码.类似与jar文件打包后可以看到源代码一样. 解决方案 android studio本地引用aar打包文件(.aar)Android studio 打包aarandroid studio 把源码和资源文件一起打包生成aar包

【分享】Android Studio专用文件转换工具:把ANSI文件批量另存为无BOM的UTF-8文件

[分享]Android Studio专用文件转换工具:把ANSI文件批量另存为无BOM的UTF-8文件 在Andoird Studio下编译java文件时,经常会出现像下面的错误: Error:(29, 43) 閿欒: 缂栫爜UTF-8鐨勪笉鍙槧灏勫瓧绗? 在这里,分享一个工具:ANSI文件批量另存为无BOM的UTF-8文件: 把下面代码用记事本存为AndroidStudioJava编码.vbs,双击即可使用: on error resume next Set WshShell=WScrip