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

在开始本节课,我尝试把项目拷贝到另一台电脑上以便继续工作,但出现了大量的“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" {// 获取 javaVMJNIEXPORT 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.rhkb.cn/news/244970.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百科同名就不能重建一个百科吗,代创建百科公司是如何做到的

发现自己的名字在百度上已经有百科词条并不出奇&#xff0c;因为同名同姓的人非常多&#xff0c;但是是不是百科已经有同名词条了就不能重建一个百科&#xff0c;很多朋友在自己做百度百科不通过时往往会发出这样的疑问。 实际上百度百科同名也是可以再重新创建的&#xff0c;…

【K8S】Service使用NodePort对外暴露应用

一、背景介绍 Pod是有生命周期的&#xff0c;当一个工作节点(node)销毁时&#xff0c;节点上运行的pods也会被销毁。ReplicationController会动态地在其他节点上创建Pod来保持应用程序的运行&#xff0c;每一个Pod都有一个独立的IP地址&#xff0c;甚至是同一个节点上的Pod。可…

菜鸟导入导出assetbundle

因为菜鸟不会用unity c#什么的&#xff0c;所以最后参考贴吧的方法用的是UABE(Unity Assets Bundle Extractor)和UABEA(Unity Assets Bundle Extractor Avalonia) 可以去github上下载 对于txt、xml什么的可以直接改&#xff0c;但是byte文件里还是会有一些类似乱码的东西&…

oracle vm安装ubuntu使用桥接网络不能访问外网

1. 问题描述 公司网络环境中&#xff0c;可以ping通内网中的所有电脑&#xff0c;ping不通百度域名以及百度的ip地址在热点共享时或者家里未出现此问题 2. 尝试的解决办法 设置网络共享&#xff0c;未起作用。后来测试通以后发现共享不共享都可以通 3. 最终解决办法 H3C禁…

案例需求:多人聊天室

文章目录 案例需求描述 p189使用wxPython绘制客户端界面 p190 案例需求描述 p189 图形界面的第三方库 使用wxPython绘制客户端界面 p190 代码示例&#xff1a; import wxclass YsjClient(wx.Frame):def __init__(self,client_name):# 调用父类的初始化方法# None&#xff1a;…

Linux——系统简介

1、从UNIX到LINUX 在目前主流的服务器端操作系统中&#xff0c;UNIX诞生于20世纪60年代末&#xff0c;Windows诞生于20世纪80年代中期&#xff0c;Linux诞生于20世纪90年代初&#xff0c;可以说UNIX是操作系统中的“老大哥”。 1.1、Linux简史 Linux内核最初是由李纳斯托瓦兹…

计算CNN卷积层和全连接层的参数量

计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题&#xff1a; 第一个问题 一个卷积操作&#xff0c;他的参数&#xff0c;也就是我们要训练的参数&#xff0c;也…

一种解决常用存储设备无法被电脑识别的方法

一、通用串行总线控制器描述 通用串行总线&#xff08;Universal Serial Bus&#xff0c;简称USB&#xff09;&#xff0c;是连接电脑与设备的一种序列总线标准&#xff0c;也是一种输入输出&#xff08;I/O&#xff09;连接端口的技术规范&#xff0c;广泛应用于个人电脑和移动…

香港高才通计划申请去年超3000万被拒!聊聊背后真实原因!

香港高才通计划申请去年超3000万被拒&#xff01;聊聊背后真实原因&#xff01; 香港高才通最新消息&#xff0c;截至2023年12月底&#xff0c;港府共收到64,820宗申请&#xff0c;当中近51,000宗获批。 具体各类申请的获批详情没有公布&#xff0c;知道的是&#xff0c;超过70…

postgresql12表膨胀解决(不锁表)

查看所有数据库占用磁盘空间 SELECTpg_database.datname AS "数据库名称",pg_size_pretty(pg_database_size(pg_database.datname)) AS "磁盘占用空间" FROMpg_database;发现有个数据库占用空间过大 查询库中所有表占用空间 SELECTtable_name,pg_size_…

Leetcode1143. 最长公共子序列

解题思路 求两个数组或者字符串的最长公共子序列问题&#xff0c;肯定是要用动态规划的。下面的题解并不难&#xff0c;你肯定能看懂。 首先&#xff0c;区分两个概念&#xff1a;子序列可以是不连续的&#xff1b;子数组&#xff08;子字符串&#xff09;需要是连续的&#xf…

JVM篇--垃圾回收器高频面试题

1 你知道哪几种垃圾收集器&#xff0c;各自的优缺点是啥&#xff0c;重点讲下cms和G1&#xff0c;包括原理&#xff0c;流程&#xff0c;优缺点&#xff1f; 1&#xff09;首先简单介绍下 有以下这些垃圾回收器 Serial收集器&#xff1a; 单线程的收集器&#xff0c;收集垃圾时…

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的&#xff0c;之前有想过RenderTexture来实现&#xff0c;不过使用RenderTexture不适合用于很多个特效&#xff0c;因为RenderTexture依赖Camera的照射&#xff0c;如果在背包中每种道具都有不同的特效&#xff0c;那使用RenderTexture则需要…

PySide6/PyQt6中Qt窗口标志/窗口属性汇总,如何正确的设置窗口标志/窗口属性

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📚 窗口标志汇总📚 窗口属性汇总📝 使用方法📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在Qt框架中,窗口标志(window flags)是用于控制窗口的各种属性和行为的强大工具。它们通过设置窗口的属性,如边框…

【江科大】STM32:USART串口(理论部分)上

串口 全双工&#xff1a;可以进行同步通信 单端信号&#xff1a;信号线传输的就是单端信号。&#xff08;也就是与地线&#xff08;GND&#xff09;的电势差&#xff09; 缺点&#xff1a;防干扰能力差 原因&#xff1a;当信号从A点传输到B点&#xff0c;理想条件是A&#xff0…

nextjs中beforePopState使用

在某些情况下&#xff0c;希望监听popstate并在路由器对其进行操作之前执行某些操作。可以使用beforePopState。 在Next.js中&#xff0c;beforePopState是一个可选的生命周期函数&#xff0c;用于在浏览器的历史记录发生更改之前执行一些操作。具体来说&#xff0c;beforePopS…

Git学习笔记(第9章):国内代码托管中心Gitee

目录 9.1 简介 9.1.1 Gitee概述 9.1.2 Gitee帐号注册和登录 9.2 VSCode登录Gitee账号 9.3 创建远程库 9.4 本地库推送到远程库(push) 9.5 导入GitHub项目 9.6 删除远程库 9.1 简介 9.1.1 Gitee概述 众所周知&#xff0c;GitHub服务器在国外&#xff0c;使用GitHub作为…

BurpSuite Pro 2023.12.1.2下载与破解-最新版BurpSuite Pro

本文在我的博客地址是&#xff1a;https://h4cker.zip/post/f05ae2e66da503f6383dffe48cdf5bac 上一次BurpSuite的分享还是在2020年 由于CSDN有防盗链&#xff0c;我自己的博客都无法访问这篇博文的图片了 至于为什么再写一次&#xff0c;是因为我看到群里这张图&#xff1a;…

如何应对强硬的项目干系人?

一、强硬项目干系人的特征和挑战 在项目管理中&#xff0c;强硬项目干系人往往具有坚定的立场、强烈的主张和不易妥协的特点&#xff0c;这给项目团队带来了诸多挑战。他们可能对项目目标、进度、成本等方面持有严格要求&#xff0c;甚至可能过度干涉项目的具体执行过程&#x…

小程序直播项目搭建

项目功能&#xff1a; 登录实时聊天点赞功能刷礼物取消关注用户卡片直播带货优惠券直播功能 项目启动&#xff1a; 1 小程序项目创建与配置&#xff1a; 第一步 需要登录小程序公众平台的设置页面进行配置&#xff1a; 首先需要是企业注册的才可以个人不能开通直播功能。服务类…