首页 > 其他分享 >使用AS的NDK工具开发JNI

使用AS的NDK工具开发JNI

时间:2023-02-01 12:36:20浏览次数:40  
标签:NDK Java env 工具 so 本地 jni JNI


从集成NDK至AndroidStudio中到实现简单案例

  1. Ctrl Alt Shift S 快捷键打开如下窗口,点击Download Android NDK.
  2. 如下图,NDK会自动下载安装好
  3. NDK下载好后配置下系统环境变量,方便编译.so库

如下可执行 ​ndk-build

使用AS的NDK工具开发JNI_so库

在这里 ​ndk-build​​ 就是将 C/C++文件编译成 .so库的命令工具。当我们在没有 jni文件夹的地方运行该命令,就会出现如上的结果;正确的使用情景是在有 jni文件夹的地方使用该命令,并且 jni文件夹内拥有 ​Android.mk、Application.mk、xxx.cpp

使用AS的NDK工具开发JNI_本地方法_02

然后在项目的app/src/main下创建jniLibs目录,将生成好的 .so库置入其中

  1. 避坑动作
  1. 在项目的 gradle.properties文件中添加 Android.useDeprecatedNdk=true,不然

使用AS的NDK工具开发JNI_本地方法_03

  1. 在 build.gradle文件中添加 sourceSets
android {

......

buildTypes {
release {

......

}

sourceSets {
main {
jni.srcDirs = []
}
}
}
}
  1. 看看代码
  1. 在 Activity 中调用 .so库写好的方法
public class OneActivity extends AppCompatActivity {

// 静态加载本地.so库
static {
System.loadLibrary("jni-test");
}

@BindView(R.id.tv_fromC)
TextView tvFromC;

@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
ButterKnife.bind(this);

// 将本地方法返回的字符串显示到页面
tvFromC.setText(getStr());
}

// 声明本地方法
public native String getStr();
}
  1. C/C++写好的本地方法
#include <jni.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

// 本地方法,注意命名规范:首字母大写_项目包名_所在Activity名_Java中声明的方法名
// env是JVM的指针,thiz是调用该方法的Java对象
jstring Java_cc_catface_helloworld_OneActivity_getStr(JNIEnv *env, jobject thiz) {

// 返回字符串
return env->NewStringUTF("来自C++的问候");

}

#ifdef __cplusplus
}
#endif
  1. Android.mk
LOCAL_PATH       := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := jni-test
LOCAL_SRC_FILES := test.cpp

include $(BUILD_SHARED_LIBRARY)

其中 LOCAL_MODULE 表示模块名称,LOCAL_SRC_FILES 表示需要编译的源文件

  1. Application.mk
APP_ABI := armeabi

API_ABI 表示CPU的架构平台类型,主要平台类型有 armeabi、x86、mips。NDK默认会编译产生全平台 .so库,即 ​APP_ABI := all​,但是我们可以指定仅产生某一平台的 .so库,因为大部分真机都是 armeabi 平台的嘛,注意使用模拟器时可能是 x86架构

最后本案例的运行结果如下

使用AS的NDK工具开发JNI_android_04


标签:NDK,Java,env,工具,so,本地,jni,JNI
From: https://blog.51cto.com/u_15950249/6031336

相关文章

  • pyqt5 简单工具类
    fromPyQt5.QtWidgetsimportQPushButton,QLabel,QLineEdit,QTextEdit,QPlainTextEdit,QCheckBoxfromPyQt5.QtWidgetsimportQComboBox,QRadioButtonclassMYWIDGET():......
  • 00- 工具类
    一.登陆前置1.中间件#中间件介绍#1.在中间件的process_request方法:#如果方法中没有返回值(返回None),继续向后走#如果方法中有返回值HttpResponse......
  • 【FFH】 gn项目构建工具学习记录
    gn项目构建工具学习我们为何要使用构建工具?对于一个新手入门简单的helloworld程序而言,我们可以直接使用gcc命令对其进行编译。对于OpenHarmony系统而言,代码规模庞大,再想要......
  • Guava:google公司开发的一款Java类库扩展工具包
    Guava是google公司开发的一款Java类库扩展工具包文档https://github.com/google/guavahttps://github.com/google/guava/wikihttps://guava.dev/releases/snapshot-jre......
  • 爬虫工具(tkinter+scrapy+pyinstaller)
    需求介绍输入:关键字文件,每一行数据为一爬取单元。若一行存在多个and关系的关键字,则用|隔开处理:爬取访问6个网站的推送,获取推送内容的标题,发布时间,来源,正文第一段(不是图片......
  • wpa_supplicant - 强有力的终端 wifi 配置工具
    最近网购了一套Raspberry-Pi2,用来跑一些神秘脚本。因为树莓派是基于ARM架构的,所以给它装上了 Ubuntu专版,对于终端下基本的 iwconfig 命令可能对现代的多种加密方式的......
  • logging --- Python 的日志记录工具
    logging ---Python的日志记录工具源代码: Lib/logging/__init__.pyImportant此页面仅包含API参考信息。教程信息和更多高级用法的讨论,请参阅基础教程进阶教......
  • 弱网测试利器-Charles工具实战
    每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试一:弱网测......
  • 国内网站 ICP 备案号查询工具 All In One
    国内网站ICP备案号查询工具AllInOneICP备案号查询公安机关互联网站安全管理服务平台https://www.beian.gov.cn/portal/registerSystemInfodemosheytapimage.......
  • JVM(六)-- JVM参数命令及工具
    JVM参数标准参数不会因为Java版本的变化而变化‐version‐help‐server‐cp非标准参数可能会因为Java版本的变化而变化-X‐Xint解释执行‐Xcomp第一次使用......