IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Studio ndk-build 编译C生成.so文件 -> 正文阅读

[移动开发]Android Studio ndk-build 编译C生成.so文件

目录

1.下载安装ndk

2.ndk环境配置

3.java和c代码编写

4.编写Android.mk和Application.mk文件

5.结果测试


现在的Android Studio打包so文件有两种方式,第一种是ndk-build编译项目,还有一种用CMake脚本构建项目,在这里主要介绍ndk-build的编译过程,并记录自己的调试过程

1.下载安装ndk

在下载ndk之前要安装好jdk和sdk并配置好环境,这里就不说了,自己之前是配好了的:

为了编译和调试,需要安装ndk组件,?Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。

安装过程:在打开的项目中,从菜单栏选择 File > Settings?>搜索 sdk > 选择SDK tools

点击Apply,等Finish后点击ok。

2.ndk环境配置

上述方式下载的ndk一般都自动放在sdk目录下面,打开你的项目的project structure配置ndk:

由于我之前Android NDK location无法配置无法选中修改 也无法下载 Download都是灰的点不了但明明已经下载了ndk并显示完成。实际 File ——?Project Structure SDK location 依然是没有配置NDK路径。然后我就参照网上的博客手动配置了一下ndk环境:

在local.properties 中手动添加本地ndk.dir路径:

然后再打开project structure就会自动出现上述情况了。(我后来改成了sdk下的这一个路径:

ndk.dir=D\:\\SDK\\ndk-bundle

为最外层工程目录下的gradle.properties的文件末尾加上android.useDeprecatedNdk=true这段代码(如果没有这个目录,自己新建一个),如下图所示:

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

添加环境变量:

3.java和c代码编写

首先新建一个java类JNIUtils.java,代码如下:我是创建在(如图)文件下的


public class JNIUtils {
    static {
        System.loadLibrary("native-jni");
    }
    public native String stringFromJNI();
}

?

然后Make Project:

完成后会在工程目录 \app\build\intermediates\javac\debug\classes\com\example\maze 下面看到自己编译后的classes文件JNIUtils.class:注意是在build\intermediates\javac下面,我之前找了好久它在哪里。

用javah命令生成头文件:

打开终端命令Terminal:输入命令:javah -d jni -classpath 自己编译后的class文件的绝对路径

例如我的:

?

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

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

//
// Created by Wang丶99WEI on 2021/12/16.
//

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

4.编写Android.mk和Application.mk文件

接着在jni文件夹下新建Android.mk和Application.mk文件

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := native-jni
LOCAL_SRC_FILES := native-lib.c
include $(BUILD_SHARED_LIBRARY)

Application.mk:

APP_ABI := all

然后在终端进入到jni目录,输入指令 ndk-build,就会生成相应的so文件。

然后需要设定一下jniLibs的文件路径,在app的build.gradle文件中Android{}内添加如下代码,其中'src/main/libs'为libnative-jni.so文件所在的路径

sourceSets {
        main() {
            jniLibs.srcDirs = ['src/main/libs']
            jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
        }
    }

5.结果测试

最后在我们来测试一下,只需要在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());
    }
}

?然后运行:

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-19 18:26:43  更:2021-12-19 18:26:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:14:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码