Android NDK:在Android Studio下的基本开发步骤和基础知识点总结(1)

本文详细介绍了如何在Android项目中使用JNI(JavaNativeInterface)创建和调用C++函数,包括头文件的定义、C代码实现、Android.mk文件编写、SO文件编译及在Java中的集成,以及使用NDK的原因和基本知识点总结。
摘要由CSDN通过智能技术生成

/*

  • Class: com_zhuanghongji_ndkdemo_JNITest

  • Method: getStringFromJNI

  • Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_zhuanghongji_ndkdemo_JNITest_getStringFromJNI

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

上面代码中的JNIEXPORTJNICALL 是jni的宏,在android的jni中不需要,当然写上去也不会有错。从上面的源码中可以看出这个函数名那是相当的长啊。。。。 不过还是很有规律的, 完全按照:java_pacakege_class_mathod 形式来命名。

注意下上面的注释:

/*

  • 1.该方法所在的类

  • Class: com_zhuanghongji_ndkdemo_JNITest

  • 2.该方法所在类中的对应方法

  • Method: getStringFromJNI

  • 3.其中()表示函数的参数为空

  • 其中Ljava/lang/String;表示函数的返回值是java的String对象

  • Signature: ()Ljava/lang/String;

  • 这里为空是指除了JNIEnv *, jobject 这两个参数之外没有其他参数,

  • JNIEnv*, jobject是所有jni函数必有的两个参数,

  • 分别表示jni环境和对应的java类(或对象)本身

*/

6.接着在jni目录下新建一个 .c文件

来实现头文件里面声明的方法。

我自己建立的是:com_zhuanghongji_ndkdemo_JNITest.c

实现代码后,如下:

// include刚才生成的头文件

#include “com_zhuanghongji_ndkdemo_JNITest.h”

JNIEXPORT jstring JNICALL Java_com_zhuanghongji_ndkdemo_JNITest_getStringFromJNI

(JNIEnv *env, jobject obj){

return (*env)->NewStringUTF(env, “I’m native function: getStringFromJNI() !”);

}

注意:在jni下面再建一个空的.c文件,如temp.c

要不编译有问题,谷歌官方有提到这个问题,可能是android studio的一个bug。

7.在 local.properties 文件中设置ndk的路径:

我的是:ndk.dir=C:\\Android\\android-ndk-r10

8.在gradle.properties文件进行配置”使用NDK”

此文件末尾增加代码:android.useDeprecatedNdk=true

9.在app目录下的 build.gradle中设置库文件名(生成的so文件名):

工程中共有两个build.gradle配置文件,我们要修改的是在<Project>\app\build.gradle这个文件

找到 defaultConfig 这项,在里面添加如下内容:

ndk{

moduleName “MyJniName” //设置库(so)文件名称,加载时会被用到

ldLibs “log”, “z”, “m” //链接时使用到的库,对应android.mk文件中的LOCAL_LDLIBS

abiFilters “armeabi”, “armeabi-v7a”, “x86” //最终输出指定三种abi体系结构下的so库,目前可有可无

}

这时,再执行”Build->Make Project”,就可以编译出so文件了。

编译出来的库文件被Studio输出到了下图的路径中:

这里写图片描述

10.在JNITest.java中增加对so的加载:

static {

System.loadLibrary(“MyJniName”);

}

至此:JNITest.java 的完整代码如下:

// JNITest.java

package com.zhuanghongji.ndkdemo;

public class JNITest {

static {

System.loadLibrary(“MyJniName”);

}

public native String getStringFromJNI();

}

11.现在在MainActivity中使用JNITest类的native方法:

package com.zhuanghongji.ndkdemo;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private TextView mTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTextView= (TextView) findViewById(R.id.tv);

String s = new JNITest().getStringFromJNI();

mTextView.setText(s);

}

}

现在运行的话,你就会看到下面的结果:

这里写图片描述

上面的字符串I'm native function: getStringFromJNI() !是C文件中的

return (*env)->NewStringUTF(env, “I’m native function: getStringFromJNI() !”);

这段代码返回的。

三、基本知识点总结


1.为什么使用NDK

  1. 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

  2. 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

  3. 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

  4. 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

2.NDK简介

  1. NDK是一系列工具的集合
  • NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

  • NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

  1. NDK提供了一份稳定、功能有限的API头文件声明

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)标准数学库(libm)压缩库(libz)Log库(liblog)

3.如何编写Android.mk文件

在jni目录下(即hello-jni.c 同级目录下)新建一个Android.mk文件,Android.mk 文件是Android 的 makefile文件。

  • 下面这个文件是官方示例 hello-jni 的makefile文件。

Copyright © 2009 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the “License”);

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an “AS IS” BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

写在最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

g-WYe8hgT0-1712065274942)]

写在最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值