首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android NDK:如何解决"E/NdkMediaExtractor: setDataSource(path)必须从Java线程调用“

Android NDK是Android Native Development Kit的缩写,是一个用于开发Android应用的工具集。它允许开发者使用C或C++编写部分应用程序,并将其与Java代码结合在一起。Android NDK提供了一组工具和库,使开发者能够直接访问设备的底层功能和硬件。

针对"E/NdkMediaExtractor: setDataSource(path)必须从Java线程调用"这个问题,可以通过以下方法解决:

  1. 确保在Java线程中调用setDataSource(path)方法:根据错误提示,setDataSource(path)方法必须在Java线程中调用。因此,您需要确保在正确的上下文中调用该方法。可以使用Java的Handler机制或AsyncTask等方式来确保在Java线程中调用该方法。
  2. 检查路径是否正确:确保传递给setDataSource()方法的路径是正确的。路径应该是有效的文件路径或URI。
  3. 确保文件可读:如果路径是一个文件路径,确保应用程序具有读取该文件的权限。您可以在AndroidManifest.xml文件中添加适当的权限声明。
  4. 检查文件格式:如果路径是一个视频或音频文件,确保文件格式受支持。Android支持的媒体格式可以在官方文档中找到。
  5. 检查NDK版本:确保您使用的NDK版本与您的应用程序兼容。您可以在build.gradle文件中指定NDK版本。
  6. 检查NDK配置:确保您的NDK配置正确。您可以在build.gradle文件中配置NDK的路径和其他相关设置。

腾讯云相关产品和产品介绍链接地址:

腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储、人工智能、物联网等。以下是一些相关产品和链接地址:

  1. 云服务器(Elastic Compute Cloud,简称CVM):提供灵活可扩展的云服务器实例,满足不同规模和需求的应用场景。详情请参考:https://cloud.tencent.com/product/cvm
  2. 云数据库(TencentDB):提供多种数据库产品,包括关系型数据库(MySQL、SQL Server、PostgreSQL)、NoSQL数据库(MongoDB、Redis)等。详情请参考:https://cloud.tencent.com/product/cdb
  3. 云存储(Cloud Object Storage,简称COS):提供安全可靠的对象存储服务,适用于存储和管理大规模的非结构化数据。详情请参考:https://cloud.tencent.com/product/cos
  4. 人工智能(AI):腾讯云提供了多种人工智能服务,包括图像识别、语音识别、自然语言处理等。详情请参考:https://cloud.tencent.com/product/ai
  5. 物联网(IoT):腾讯云物联网平台提供了全面的物联网解决方案,包括设备接入、数据管理、应用开发等。详情请参考:https://cloud.tencent.com/product/iot

请注意,以上仅是腾讯云的一些相关产品和服务,其他云计算品牌商也提供类似的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android NDK开发完全剖析

这些工具我们应该学会怎么使用,但是它并不能支持我们深入学习音视频技术,很多跨平台和使用广泛的库都是C/C++的,所以NDK开发是音视频技术学习的“门槛”,本文的目的就是带你0开始开始学习NDK相关的知识点...交叉编译有一个完整的过程: 交叉编译的过程来看,其实和正常的编译没什么不一样,只不过有两点: 交叉编译使用的是交叉编译工具 交叉编译链接的库或者头文件必须明确指定 例如我们使用gcc编译的过程,有一些库函数已经指定在系统的...PATH路径中了,我们不必要单独指定,但是交叉编译的时候则必须要明确指定。...JNI多线程: 我们经常遇到的一个场景是,在JNI中可能会开启一个线程如何回调到Java层来?.../darwin-x86_64/bin/aarch64-linux-android-addr2line' ADDRLINE_PATH = NDK_HOME + ADDRLINE SO_PATH = '

1.8K10

Android NDK开发基础

安装步骤:developer.android.com/studio/proj… 一、基础用法 在local.properties中配置ndk目录: ndk.dir=/Users/bc/android-ndk-r17c...代码调用加载,.a文件不能在运行过程中直接由java代码加载;so文件在运行中可以去加载其他的so文件或者a文件; ndk目录下的readelf命令可以查看so(符号表等)的相关信息。...或 AttachCurrentThreadAsDaemon() 函数将JavaVM附加到线程,附加后的线程可以调用JNI代码: // 保存JavaVM,方便在子线程中获取 static JavaVM *...命令 ndk-stack命令位于{NDK_root}/ndk-stack,使用时需要将crash的log复制到一个txt文件中,这个命令会txt中的 A/DEBUG: *** *** *** ***.../main/cpp/native-lib.cpp:9 相关视频推荐 NDK身份证识别技术项目实战 Android(安卓)开发零基础入门到精通 本文转自 https://juejin.cn/post/6952049081464127518

1.8K21

Assimp Android 编译

提供C/C++的API,提供C#, Java, Python, Delphi, D等语言的封装调用。支持Android和iOS平台。...必须设置的几个环境变量如下: export ANDROID_NDK_PATH=/Users/hi/Library/Android/sdk/ndk-bundle // 设置DNK路径 export ANDROID_SDK_PATH...=/Users/hi/Library/Android/sdk/android-toolchain // 这个也必须设置,其中android-toolchain就是上面生成的啦 export PATH=$...PATH:/Users/hi/Library/Android/sdk/android-toolchain/bin // 必须设置 cmake生成makefile 设置了环境变量之后,我们就可以通过cmake...其中-j8是指多线程个数,根据自己电脑配置,选择不同线程数,线程数越多编译的越快。 ? 但是通常事情没那么简单,这一步一般会遇到各种问题,要耐心Google,一个一个的解决

2.4K40

【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

: 需要下载最新版本的 SDK, 即 android-21 5.0 版本的 SDK; -- Android NDK : 文档中指出 编译使用的 NDK 必须是 r9 版本的, 所以建议也使用这个版本;...export ANDROID_NDK=/home/octopus/develop/android-ndk-r9c export PATH=$PATH:$ANDROID_SDK/platform-tools...配置 NDK 目录 : export ANDROID_NDK=/home/octopus/develop/android-ndk-r9c ; -- 配置 SDK 工具目录 : export PATH=PATH...环境变量文件最后追加的内容 :  请仔细核对, 除了 SDK, NDK, JDK具体路径 和 交叉编译指令 不一样 之外, 变量名称 必须一致; export JAVA_HOME=/usr/lib/jvm.../develop/android-sdk-linux export ANDROID_NDK=/home/octopus/develop/android-ndk-r9c export PATH=$PATH

4.4K40

cocos android分析

/e/ADT/android-ndk-r7c 2: export ANDROID_NDK_ROOT 3: NDK_ROOT=/cygdrive/e/ADT/android-ndk-r7c...4: export NDK_ROOT 将libgnustl_static.aNDK中的android-ndk-r7c\sources\cxx-stl\gnu-libstdc++\libs...这个解决方式上看应该是stl的引用不一致导致的问题。但编译中会报错“png.a can not find”,可是path路径确实没什么问题,所以比較坑爹。总之这样就搞定了。我也没怎么深究。...Java层面流程例如以下: 如上,假设熟悉Android界面开发,能够基类了解到Java层面是通过Activity、GLSuffaceView来进行的显示。 这里不具体介绍。假设有兴趣。...在2中调用jni里面的nativeRender实现一帧的渲染。而GLSurfaceView则负责UI交互的监听。 这样的机制的优点是在Java中Renderer渲染器是独立线程调用

1.5K20

Android跨进程通信IPC之3——关于JNI的那些事

虚拟机在从相同的Java线程中对本地方法进行多次调用时,保证传递给本地方法的接口指针是相同的。但是,一个本地方方可以被不同的Java线程调用,因此可以接受不同的JNI接口指针。...虚拟机在从相同的Java线程对本地方法进行多次调用时,保证传递给本地方法的接口指针是相同的。但是,一个本地方法可被不同的Java线程调用,因此可以接受不同的JNI接口指针。 ?...JNIEnv只在当前线程中有效。Native方法不能将JNIEnv从一个线程传递到另一个线程中。相同的Java线程对Native方法多次调用时,传递给Native方法的JNIEnv是相同的。...但是,一个本地方法可能会被不同的Java线程调用,因此可以接受不同的JNIEnv。 和JNIEnv相比,JavaVM可以在进程中各个线程间共享。...七、总结 本文主要是通过实例,基于Android 6.0源码分析 JNI原理,讲述JNI核心功能: 介绍了JNI的概念及如何查找JNI方法,让大家明白如何Java层跳转到Native层 分了JNI

2.5K50

Android 应用开发】Android 开发 之 JNI入门 - NDK入门到精通

生成 动态库 so 文件 : 进入 Android.mk 所在目录, 在该目录执行 ndk 下的 ndk-build 命令; -- e....类, 以及class中的方法; C与Java如何交流 :  -- JNI规范 : C语言与Java语言交流需要一个适配器, 中间件, 即 JNI, JNI提供了一种规范;  -- C语言中调用Java方法...工具  Google的Android开发者官网上下载该工具, 注意NDK工具分类 : 下载地址 -http://developer.android.com/tools/sdk/ndk/index.html...调用JNI函数 可以访问java虚拟机, 操作java对象; JNI线程相关性 : JNIEnv只在当前的线程有效,JNIEnv不能跨线程传递, 相同的Java线程调用本地方法, 所使用的JNIEnv...是相同的, 一个Native方法不能被不同的Java线程调用; JNIEnv结构体系 : JNIEnv指针指向一个线程相关的结构,线程相关结构指向一个指针数组,指针数组中的每个元素最终指向一个JNI

3K11

老司机带你快速掌握JNI

前言 JNI 是一种用来使得java代码和c代码之间互相调用的技术。那么我们会问,java代码为什么要调用c代码呢?...要掌握jni,就必须熟练掌握Android.mk的语法规范。参考资料见:Android.mk详解。...上面这段配置中: LOCAL_PATH:=$(call my-dir) Android.mk文件必须以LOCAL_PATH变量开始,它用于在树中定位文件。...2,使用ant编译,可以将ndk-buildant的配置文件(build.xml)里去掉,而在外面先执行ndk-build单独生成.so,然后再执行ant debug生成apk。...关于android studio或者eclipse中如何配置jni编译,请自行上网查阅资料,也可以参考下面链接: Android Studio使用新的Gradle构建工具配置NDK环境、手把手教你通过Eclipse

83620

Android NDK开发入门

应用程序框架层 Android平台最常用的组件和服务都在这一层,是每个Android开发者必须熟悉和掌握的一层,是应用开发的基础。...接下来我们看一下如何编写Android JNI ,以及需要的流程。...官方示例 默认创建Android NDK工程时,Android提供了一个简单的JNI交互示例,返回一个字符串给Java层,方法名的格式为:Java_包名_类名_方法名 。...GetStringCritical和ReleaseStringCritical: 为了增加直接传回指向Java字符串的指针的可能性(而不是拷贝).在这2个函数之间的区域,是绝对不能调用其他JNI函数或者让线程阻塞的...4.2.6 小结 Java字符串转C/C++字符串: 使用GetStringUTFChars函数,必须调用ReleaseStringUTFChars释放内存。

1.6K50

Android JNI(一)——NDK与JNI基础

我们知道Android的SDK主要是基于Java的,所以导致了在用Android SDK进行开发的工程师们都必须使用Java语言。...简单的来说: Android NDK 就是一套工具集合,允许你使用C/C++语言来实现应用程序的部分功能。 NDK 是Native Develop Kit的含义,含义很容易理解,本地开发。...总之,在Android的SDK之外,有一个工具就是NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.co文件,然后在Java调用。...ndk到so.png 从上图这个Android系统框架来看,我们上层通过JNI来调用NDK层的,使用这个工具可以很方便的编写和调试JNI的代码。...(属性、方法),完全不用管JVM内部是怎么实现的,如何为新建的对象申请内存,使用完之后如何释放内存,只需要知道有个垃圾回收器在处理这些事情就行了,然而,Java虚拟机创建的对象传到C/C++代码就会产生引用

2K32

JNI 入门到实践,万字爆肝详解!

---- 这篇文章是 NDK 系列文章第 5 篇,专栏文章列表: 一、语言基础: 1、NDK 学习路线:怎么学 & 我的经验 2、C 语言基础 3、C ++ 语言基础 4、C/C++ 编译过程:源码到程序运行... Java 调用 Native 或 Native 调用 Java 的成本很高,使用 JNI 时要限制跨越 JNI 边界的调用次数; 问题 2 - 引用类型数据的回收: 由于引用类型数据(例如字符串...JNI 访问 Java 字段与方法 这一节我们来讨论如何 Native 层访问 Java 的字段与方法。在开始访问前,JNI 首先要找到想访问的字段和方法,这就依靠字段描述符和方法描述符。...7.1 不能跨线程的引用 在 JNI 中,有 2 类引用是无法跨线程调用的,必须时刻谨记: JNIEnv: JNIEnv 只在所在的线程有效,在不同线程调用 JNI 函数时,必须使用该线程专门的 JNIEnv...下一篇,我们开始讲 Android NDK 开发。关注我,带你建立核心竞争力,我们下次见。

2K21

Android NDK开发扫盲及最新CMake的编译使用

JNI(Java Native Interface):Java本地接口。是为了方便Java调用c、c++等本地代码所封装的一层接口(也是一个标准)。...只有有了这些 NDK 中的编译工具才能准确的编译 c/c++ 代码。 ndk-build 文件是 Android NDK r4 中引入的一个 shell 脚本。其用途是调用正确的 NDK 构建脚本。...其实最终还是会去调用 NDK 自己的编译工具。 那 CMake 又是什么呢。脱离 Android 开发来看,c/c++ 的编译文件在不同平台是不一样的。...3 资料文献 ------ 首推 Android NDK 官方文档,虽然很多都不完整,但是绝对是必须看一遍的东西。 当初次接触 NDK 开发又觉得新建的 Hello World 项目过于简单时。...以上文档资料仅为了解决 NDK 开发过程中编译配置问题,具体 c/c++ 的逻辑编写、jni等不在此范畴。

2.1K30

Android 增加JNI

或 C、C++代码调用 Java 代码 特别注意: JNI是 Java 调用 Native 语言的一种特性 JNI 是属于 Java 的,与 Android 无直接关系 1.2 为什么要有JNI 背景...:实际使用中,Java 需要与 本地代码 进行交互 问题:因为 Java 具备跨平台的特点,所以Java 与 本地代码交互的能力非常弱 解决方案: 采用 JNI 特性 增强 Java 与 本地代码交互的能力...(C/C++)实现 特点 额外注意 2.2 使用步骤 配置 Android NDK环境 创建 Android 项目,并与 NDK进行关联 在 Android 项目中声明所需要调用的 Native...在Gradle的build.gradle添加ndk节点 至此,将Andorid Studio的项目 与 NDK 关联完毕 下面,将真正开始讲解如何在项目中使用NDK 步骤3:创建本地代码文件 即需要在..._1ho_ndk_1demo_MainActivity_getFromJNI 格式 = Java _包名 _ 类名_Java需要调用的方法名 Java必须大写 对于包名,包名里的.要改成_,_要改成_

1.5K40

Android NDK 开发中快速定位 Crash 问题

我们也可以借助于 ASAN (注意 Android 版本)进行定位,具体可以参考文章:用 Asan 提前解决 NDK 疑难 crash 写两行代码,先制造一个简单的 crash 场景。...查找线程和进程 ID 图中 pid 表示进程 ID ,tid 表示线程 ID 。...以上 backtrace 中, #00 到 #03 共 4 行信息表示 crash 时函数调用关系,调用关系为从下往上,即 #03 调用了 #02 的方法,以此类推, #00 行告诉我们是拷贝字符串时遇到了问题...addr2line 是通过 pc (程序计数器)值来定位代码,“-e” 后加 .so 文件名,“-f”表示输出函数名。实际上 log 中可以看到 AndroidStudio 自动帮我们做了这件事。...D:\NDK>D:\NDK\android-ndk-r16\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64

1.2K30

Android studio 下JNI编程实例并生成so库的实现代码

最近需要使用JNI编程,学了下JNI,并且在Android Studio下实现了一个小demo。这期间有一些坑,还好都解决了,想分享出来,希望大家少走弯路。...本文中采用的平台是Windows,NDK环境已经搭建好,这方面资料很多,大家可以自行百度。 本文分为两个部分: 1.如何通过编写Jni实现native方法的调用。...以下是正文: 一,编写jni文件,实现本地方法 1,建立一个新工程,只有一个MainActivity,里面加载库文件并且调用若干本地方法,然后通过Android Studio里的build-makeProject...我采用的方法是在local.properties文件最后一行加入: ndk.dir=I\:\\Andriod\\NDK\\android-ndk-r10b 6,build.gradle(app下):文件下加入...,在jni文件夹下新建Android.mk文件,写入以下内容: LOCAL_PATH := $(call my-dir) //固定写法,把路径赋给LOCAL_PATH变量 include $(CLEAR_VARS

2K31
领券