第21课 在Android Native开发中架起java与c++互通的桥梁

news2024/11/15 13:41:34

在开始本节课,我尝试把项目拷贝到另一台电脑上以便继续工作,但出现了大量的“could not be resolved”问题,尝试包含新的include路径也无法解决该问题,最后删除了项目的Native Support,然后重新添加Native Support才解决。

一、添加和删除Native Support

添加Native Support的方法比较简单,不再多说,删除Native Support的方法如下:

1. 到项目目录下找到.cproject文件并删除。

2. 到项目目录下找到.project文件,用记事本打开并删除以下内容跟cdt有关的内容:

<buildCommand>

     <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>

     <triggers>clean,full,incremental,</triggers>

     <arguments>

     //删除中间内容

     </arguments>

</buildCommand>



<buildCommand>

     <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>

     <triggers>full,incremental,</triggers>

     <arguments>

//删除中间内容

     </arguments>

</buildCommand>



     <nature>org.eclipse.cdt.core.cnature</nature>

     <nature>org.eclipse.cdt.core.ccnature</nature>

     <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>

     <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>

二、在Android中添加线程

与PC端类似,为了使FFmpeg运行起来不影响UI,在Android中也需要开启新线程单独运行FFmpeg。我们可以将init函数修改如下并添加与PC端程序同名的函数以使二者保持一致:

std::string fmlp::init() {

    pthread_attr_t attr;

    pthread_attr_init(&attr);

    pthread_attr_setdetachstate(&attr, 1);

    void *para;

    threadID = pthread_create(&runFFmpegThread, &attr, runFFmpegThreadProc,para);

    return "Hello fmlp...";

}



void *fmlp::runFFmpegThreadProc(void * lpParam) {

    fmlp *pThis = (fmlp*)lpParam;

    pThis->runFFmpeg();

}





int fmlp::runFFmpeg() {

    return 0;

}

三、架起java与c++互通的桥梁

在上面的init函数中,我们可以将字符串"Hello fmlp..."通过Native调用的方式返回给java,但在实际的开发中,还需要将线程中的相关信息返回给java以判断子线程是否正常运行。为了更方便的实现java与c++间的相互通信,可以在demo.cpp中添加以下代码:

jobject mainActivityObj;

JavaVM *jvm;

fmlp *myFmlp;

extern "C" {

// 获取 javaVM

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVm, void *pVoid) {

    jvm = javaVm;

    return JNI_VERSION_1_6;

}

JNIEXPORT void JNICALL Java_com_example_demo_MainActivity_sendActivityToNative(JNIEnv *env, jobject obj) {

    mainActivityObj = env->NewGlobalRef(obj);

}



JNIEXPORT jstring JNICALL Java_com_example_demo_MainActivity_initFmlp(JNIEnv *env, jobject obj) {

myFmlp=new fmlp();

myFmlp->jvm=jvm;

myFmlp->mainActivityObj=mainActivityObj;

string str=myFmlp->init();

return env->NewStringUTF(str.c_str());

}

修改fmlp.cpp将相关信息返回到主界面:

int fmlp::runFFmpeg() {



JNIEnv *env = NULL;

jint result = pThis->jvm->AttachCurrentThread(&env, 0);

if (result != JNI_OK) {

    return 0;

}



jclass mainActivityClass = env->GetObjectClass(pThis->mainActivityObj);



const char *showSig = "(Ljava/lang/String;)V";

jmethodID show = env->GetMethodID(mainActivityClass, "disMsgFromFmlp", showSig);

env->CallVoidMethod(pThis->mainActivityObj, show,(*env).NewStringUTF("runFFmpeg..."));

return 0;

}

调试运行,能正确返回信息" runFFmpeg......"则表示程序运行正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1408719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙学习基础篇 - Text文本组件

该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Text文本组件是可以显示一段文本的组件。该组件从API Version 7开始支持&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 子组件 可…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中&#xff0c;需要用深度学习模型…

上门服务小程序|预约上门服务系统开发有哪些功能?

在现代快节奏的生活中&#xff0c;压力和疲劳常常困扰着我们。为了缓解这种状况&#xff0c;越来越多的人选择去按摩店进行放松。然而&#xff0c;繁忙的工作和家庭责任往往让我们无法抽出时间去按摩店。在这种情况下&#xff0c;上门按摩服务应运而生。而随着科技的发展&#…

VI / VIM的使用

vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容 vi 的所有指令&#xff0c;而且 还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于 x win…

SpringMVC第二天

今日内容 能够掌握SSM整合的流程 能够编写SSM整合功能模块类 能够使用Result统一表现层响应结果 能够编写异常处理器进行项目异常 能够完成SSM整合前端页面发送请求实现增删改查操作 能够编写拦截器并配置拦截器 一、SSM整合【重点】 1 SSM整合配置 问题导入 请描述“SSM整…

IntelliJ IDE 插件开发 | (五)VFS 与编辑器

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

Windows AD 组策略 通过脚本修改管理员密码:以安全方式

因为本文主要讲的是通过脚本如何以安全方式设置密码&#xff0c;所以关于组策略如何设置请参考这里&#xff1a; WinServer 2019 AD 组策略 启用本地管理员账号&#xff0c;重置密码_ad域命令启用administrator账户-CSDN博客 我们首先要讲一下&#xff0c;以一般方法创建的脚…

力扣1027. 最长等差数列

动态规划 思路&#xff1a; 可以参考力扣1218. 最长定差子序列目前不清楚公差&#xff0c;可以将序列最大最小值找到&#xff0c;公差的范围是 [-(max - min), (max - min)]&#xff0c;按公差递增迭代遍历求出最长等差数列&#xff1b; class Solution { public:int longest…

写一份简单的产品说明书:格式和排版建议

现在的市场竞争那么激烈&#xff0c;拥有一份简洁明了的产品说明书可以说是很重要的。产品说明书不仅向用户提供了对产品的详细了解&#xff0c;还能够树立品牌形象&#xff0c;提升用户体验。 | 一、写一份简单的产品说明书—一些建议 1.创意封面设计 一个吸引人的封面设计能…

浅析混沌工程的主要概念和作用

混沌工程是一种系统设计和测试方法&#xff0c;旨在通过有目的地在生产环境中引入故障来发现和解决系统中的潜在问题。通过模拟故障和持续测试&#xff0c;有助于发现和解决系统中的潜在问题&#xff0c;提高系统的可靠性、弹性和安全性。 故障引入&#xff1a; 混沌工程通过故…

for循环延时时间计算

​ 文章目录 前言一、计算方式二、for循环 2.1 for循环里定义变量2.2 codeblock设置C99标准 三、四、总结 前言 之前做led点亮的实验&#xff0c;好像是被delay函数影响了&#xff0c;因为delay参数设置的不对&#xff0c;led没有正常闪烁。现在就想搞明白一些。 一、计算…

Windows11 Copilot助手开启教程(免费GPT-4)

Windows11上开启Copilot助手教程踩坑指南 Copilot介绍Copilot开启步骤1、更新系统2、更改语言和区域3、下载 ViVeTool 工具4、开启Copilot 使用 Copilot介绍 Windows Copilot 是 Windows 11 中的一个新功能&#xff0c;它可以让你与一个智能助理进行对话&#xff0c;获取信息&…

Win11在某些时候想要关闭windows安全中心应该怎么做,安装navicat事例

比如在安装navicat时&#xff0c;需要注册&#xff0c;注册机被删&#xff0c;就是windows安全中心干的&#xff0c;所以要想办法&#xff0c;不让他把注册机删掉&#xff0c;那么这里有一个比较巧妙的办法&#xff0c;就使用排除项&#xff0c;关闭 实时保护&#xff0c; 添…

app逆向-frida安装调试

文章目录 一、前言二、安装三、hook调试&#xff0c;hook java类 一、前言 frida是一款基于python javascript 的hook框架&#xff0c;可运行在android ios linux winosx等各平台&#xff0c;主要使用动态二进制插桩技术 官方网站&#xff1a;https://frida.re/docs/home/ a…

【深度学习】初识深度学习

初识深度学习 什么是深度学习 关系&#xff1a; #mermaid-svg-7QyNQ1BBaD6vmMVi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QyNQ1BBaD6vmMVi .error-icon{fill:#552222;}#mermaid-svg-7QyNQ1BBaD6vmMVi .err…

探索Gin框架:快速构建高性能的Golang Web应用

前言 Gin框架是一个轻量级的Web框架&#xff0c;基于Go语言开发&#xff0c;旨在提供高性能和简洁的API。它具有快速的路由和中间件支持&#xff0c;使得构建Web应用变得更加简单和高效。无论是构建小型的API服务还是大型的Web应用&#xff0c;Gin框架都能够满足你的需求。 无论…

开源免费无广告Gopeed,现代化的高速下载器,支持(HTTP、BitTorrent、Magnet)等多种协议下载,开源免费、无广告、高度可定制、不限速。

目录 特点 支持的平台 一键部署 体验 特点 全平台支持、开源免费&#xff0c;不限速、无广告 遵循 GPL-3.0 开源协议 支持&#xff08;HTTP、BitTorrent、Magnet&#xff09;协议下载 高速下载&#xff0c;底层使用golang协程并发下载 每日自动更新 tracker 列表 去中心…

element-ui 树形控件 通过点击某个节点,遍历获取上级的所有父节点和本身节点

1、需求&#xff1a;点击树形控件的某个节点&#xff0c;需要拿到它上级的所有父节点进行操作 2、代码&#xff1a; 树形控件代码 <el-tree:data"deptOptions"node-click"getVisitCheckedNodes"ref"target_tree_Speech"node-key"id&qu…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

IDEA自带数据库导入SQL文件

右键数据库 - > 点击SQL Scripts -> run SQL Scripts 就可以选择对应的文件了