Android电视下的JNI demo

安卓使用VLC播放视频,实现截图和录制功能 使用vlc-android库播放RTSP视频 阅读详情

参考文章:
https://my.oschina.net/innost/blog/486594
http://www.cnblogs.com/larrylawrence/p/3898782.html

这几天学习下Android JNI demo,编译ok,记录下便于查询。
1、TV项目android code或是android 源码/linux系统(Ubuntu12.0.4)
2、动态注册JNI 函数(JNI_OnLoad)
3、package name:myjni,两个java文件,一个c文件,两个Android.mk文件,一个AndroidManifest.xml文件
4、编译位置:android\lollipop\device\xxxx\xxxx\app\,这个路径是本地路径,其他人的可能不一样,位于device路径下面,JNI的例子也可以参照development/samples/SimpleJNI,或是放到samples下面进行编译。
5、linux下编译过程中的error:jni下面如果是c++文件就用env->,若用的c文件,则用(*env)->,而且引用的函数里要多加一个参数env,不然会报错,vm指针的话类似。比如: error: too few arguments to function ‘(*env)->FindClass,在下文8中clazz = (*env)->FindClass(env,className)。
6、编译命令:
android\lollipop下面:
source build/envsetup.sh;
有些可能需要在lunch + ANDROIDLUNCHNAME;
mm -B;

7、生成的文件:

Install: out/target/product/xxxx/system/lib/libjnitext.so
Install: out/target/product/xxxx/system/app/MyJNI/MyJNI.apk

8、编译文件内容:
app/MyJNI/下面的Android.mk内容:

TOP_LOCAL_PATH:= $(call my-dir)
# Build activity
LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyJNI
LOCAL_JNI_SHARED_LIBRARIES := libjnitext
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

AndroidManifest.xml里的内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xxxx.myjni">

    <application  android:label="Main Activity">
        <activity android:name="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

jni文件夹下面:JNITest.c和Android.mk
JNITest.c内容:
xxxx是指package name

#define LOG_TAG "myjni JNITest.c"
#include <utils/Log.h>
#include <stdio.h>
#include <string.h>
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/*#include <com_example_xxxx_myjni_JNITest.h>*/
/* Header for class com_example_xxxx_myjni_JNITest */
/*
 * Class:     com_example_xxxx_myjni_JNITest
 * Method:    getCLangString
 * Signature: ()Ljava/lang/String;
 */
static jstring getCLangString(JNIEnv *env, jobject objt)
  {
    return (*env)->NewStringUTF(env,"This is JNItest!");
  }
/*
JNIEXPORT jint JNICALL Java_com_example_xxxx_myjni_JNITest_addint
        (JNIEnv *env, jobject objt, jint a, jint b)
{
      int c=a+b;
      return c;
}*/

static const char *classPathName = "com/example/xxxx/myjni/JNITest";  
static JNINativeMethod methods[] = {
  {"getCLangString", "()Ljava/lang/String", (void*)getCLangString },
};
/*
 * Register several native methods for one class.
 */
static int registerNativeMethods(JNIEnv* env, const char* className,
    JNINativeMethod* gMethods, int numMethods)
{
    jclass clazz;
    clazz = (*env)->FindClass(env,className);
    if (clazz == NULL) {
        ALOGE("Native registration unable to find class '%s'", className);
        return JNI_FALSE;
    }
    if ((*env)->RegisterNatives(env,clazz, gMethods, numMethods) < 0) {
        ALOGE("RegisterNatives failed for '%s'", className);
        return JNI_FALSE;
    }
    return JNI_TRUE;
}
/*
 * Register native methods for all classes we know about.
 *
 * returns JNI_TRUE on success.
 */
static int registerNatives(JNIEnv* env)
{
  if (!registerNativeMethods(env, classPathName,
                 methods, sizeof(methods) / sizeof(methods[0]))) {
    return JNI_FALSE;
  }
  return JNI_TRUE;
}

/*
 * This is called by the VM when the shared library is first loaded.
 */ 
typedef union {
    JNIEnv* env;
    void* venv;
} UnionJNIEnvToVoid;

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    UnionJNIEnvToVoid uenv;
    uenv.venv = NULL;
    jint result = -1;
    JNIEnv* env = NULL;    
    ALOGI("JNI_OnLoad");
    if ((*vm)->GetEnv(vm,&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
        ALOGE("ERROR: GetEnv failed");
        goto bail;
    }
    env = uenv.env;
    if (registerNatives(env) != JNI_TRUE) {
        ALOGE("ERROR: registerNatives failed");
        goto bail;
    }
    result = JNI_VERSION_1_4;    
bail:
    return result;
}

jni/Android.mk的内容

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libjnitext
#LOCAL_PACKAGE_NAME := MyJNI
# Also need the JNI headers.
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE)
LOCAL_SRC_FILES := JNITest.c

# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \
libutils liblog
include $(BUILD_SHARED_LIBRARY)

myjni下面的两个java文件
xxxx是指package name
JNITest.java内容:

package com.example.xxxx.myjni;
public class JNITest {
    static {
        System.loadLibrary("jnitext");   //defaultConfig.ndk.moduleName
    }
    public native String getCLangString();
}

MainActivity.java内容

package com.example.xxxx.myjni;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
    private TextView textView,textView2;
    //private Button button1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
         TextView tv = new TextView(this);

        //textView = (TextView)findViewById(R.id.jnitest1);
        JNITest jniTest=new JNITest();
        tv.setText(jniTest.getCLangString());
        setContentView(tv);
    }
}
Unidbg模拟执行安卓Native与Java层代码,绕过环境检测实战指南 在移动安全与逆向工程领域,环境检测是应用常见的防护手段,旨在识别和阻止代码在非授权或调试环境中运行。其原理通常是通过检查系统属性、文件路径、进程模块及硬件特征等维度来判定运行环境是否可信。为了应对这一挑战,模拟执行技术应运而生,它能在隔离的虚拟环境中动态运行目标代码,从而在不触动真实系统的情况下进行分析与测试。Unidbg作为一款基于Unicorn引擎的高阶模拟工具,其技术价值在于能够同时模拟执行Android的本地库(so文件)和Java层代码,无需依赖完整的Android系统,为安全研究人员提供了高度可 阅读详情

相关推荐

安卓端MP3编码标准答案:LAME库NDK编译与JNI封装实践

音频编码是将原始PCM数据压缩为MP3等格式的核心技术,在移动端音频处理中至关重要。LAME作为业界领先的MP3编码库,通过NDK交叉编译可生成Android平台可加载的so库,借助JNI接口实现Java层调用。这一技术路径解决了Android系统原生不支持MP3编码的痛点,使开发者无需依赖服务端转码即可在本地完成高质量、低延迟的录音压缩。适用于语音笔记、铃声制作、音频批处理等场景。完整流程涵盖从NDK编译静态库到JNI封装,帮助开发者在Android端稳定实现PCM到MP3的转换。

weixin_29174141的博客 267

AndroidTV开发教程(1)

AndroidTV应用开发简介目前,网上还没有对AndroidTV的足够的介绍。在本系列教程中,将介绍如何开发AndroidTV应用程序。此篇文章的主要目的是了解AndroidTV的UI实现。

YiTu大人的博客 1万+

云卓H16安卓嵌入式开发:GPIO/UART/PWM硬件控制实战

安卓嵌入式开发并非仅限于手机App开发,而是面向工业边缘设备的底层硬件协同编程范式。其核心原理是通过JNI桥接Java应用层与Linux内核设备驱动(如/dev/gpiochip0、/dev/ttyS2),依托BSP源码实现对GPIO、UART、PWM等外设的精确控制。该技术显著提升工业HMI、自助终端、智能闸机等场景的协议兼容性与实时响应能力,支撑PLC对接、传感器采集、电机驱动等关键任务。云卓H16作为典型ARM架构安卓嵌入式平台,提供定制Android 9系统与可编译BSP,使开发者能直接操作硬件抽象

weixin_29195217的博客 101

UVC系列1-Android盒子控制云台摄像头系列

Android作为host端控制云台摄像头整个实现过程中涉及了Android kernel底层UVC部分,Android kernel代码的编译,USB协议,Android JNI方面的知识。 刚开始项目提出这个需求的时候,想到的是通过Android原生的USB API 去控制外接的USB PTZ摄像头,因为大多数的云台摄像头支持pelco-d或是pelco-p协议,而Android提供的接口可以...

Chuck Chan的专栏 1449

starRTC安卓端WebRTC P2P音视频通信底座深度解析

WebRTC是一种基于浏览器的实时音视频通信标准协议,其核心价值在于支持端到端P2P连接、低延迟传输与自适应编解码协商。在安卓平台落地时,需突破NAT穿透、JNI桥接、ICE候选策略及H.265兼容性等工程瓶颈。starRTC作为可裁剪、可调试的开源参考实现,将WebRTC协议栈与安卓原生开发深度耦合,提供从信令中转、STUN/TURN配置到SFU/MCU分层架构的完整技术路径。它适用于需私有化部署、规避SaaS绑定、并具备音视频底层调优能力的中高级安卓开发团队,尤其在远程医疗、在线教育、工业巡检等对实时性

weixin_29184371的博客 326

双向晶闸管交流调压基础知识及Multisim电路仿真

本文介绍了双向晶闸管交流调压电路的工作原理及应用。该电路由双向晶闸管、RC移相电路和双向触发二极管组成,通过调节电位器改变触发角实现电压调节。当电位器阻值减小时,触发角减小,输出电压升高;阻值增大时,触发角增大,输出电压降低。Multisim仿真展示了不同电位器档位下的波形特征:0%档位时全导通,50%档位时半导通,100%档位时基本关断。该电路结构简单、调节平滑,广泛应用于调光、调速等场合,但会产生谐波干扰。

XU157303764的博客 836

安卓 tv java_Android为TV端助力 关于JNI的使用方法

1首先在java里面定义你需要的native方法2打开cmd,进入doc窗口,如果是android项目就进入到你当前项目的bin目录下,在doc里面输入cd E:\workspace\Test1 也就是进入你项目的所在地,3.然后在当前项目的根目录创建一个名为jni的目录,用于存储头文件,so库等等4.在doc里面输入javah -classpath bin\classes -d jni com...

weixin_28889765的博客 185

Windows 11“此应用已被管理员阻止运行”解决方案

通过本文介绍的两种方法,你应该能够解决Windows 11中“此应用已被管理员阻止运行”的问题。无论你选择创建新管理员账户还是禁用管理员批准模式,都请确保了解相关操作的风险,并根据你的实际需求做出选择。通过禁用“用户账户控制:以管理员批准模式运行所有管理员”设置,可以解决因系统安全设置导致的应用程序被阻止运行的问题。这种方法适用于那些希望简化管理员账户操作流程的用户,但需要注意可能带来的安全风险。通过创建并登录具有管理员权限的新账户,可以解决因系统安全设置导致的应用程序被阻止运行的问题。

mmoo_python的博客 1万+

Android JNI作用及其详解

Android JNI作用及其详解 Java Native Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。  1.从如何载入.so档案谈起  由于Android的...

maozhuxigood 415

实用软件工程(第2版)吕云翔编简答题部分答案(自用整理)

整理自用

m0_61217768的博客 4107

将3DMax编辑的动画,导入给已经绑定蒙皮好的模型给Unity使用

现在程序猿想做独立游戏,即容易,也难。 说容易,引擎越来越傻瓜化。 说难,到哪去找靠谱的美术? 好在伟大的AssetStore(还有淘宝上)有大批不赖的资源可以用。 现成的模型,是好,但是,没有配套的动作,却是一件让人头疼的事情,即使用IK动画,也不能完美的弥补这一缺陷。 虽然Unity具备 retargeting 功能,但是,也不是万能的,很多情况下,非标准的骨骼会导致

正经的时候都在打游戏 1万+

Android 网页保存

1、Android JNI https://www.jianshu.com/p/b9a595022462 https://www.cnblogs.com/skywang12345/archive/2013/05/23/3095074.html https://www.cnblogs.com/renhui/category/1329373.html https://www.cnblogs.com/fnlingnzb-learner/p/7366025.html https://www.jianshu

一笑悬命的专栏 302

【图像去噪】基于梯度为0法实现图像去噪附matlab代码

近几年,徐立提出的 L0 梯度最小化模型在图像平滑领域得到了广泛的应用和发展[11]. 和以往的局部滤波模型不同的是该模型可以全局的估计图像的像素值,因此,L0 梯度最小化模型在处理图像的同时能够很好的保护图像的边缘.​。

qq_59747472的博客 182

android tv github,GitHub - dongbingliu/Android-tv-widget: Android tv,盒子,投影仪 控件

【前言】因为要加强 Android 投影仪的 luncher 倒影国际化的功能,所以开始的时候在BroderView的基础改了些东西.后来又一些BUG,修复了,感觉毕竟是用的别人的开源代码,如果不开源又不好意思,再说了,这个代码也不属于在职期间开发,是业余时间编写,所以没有什么问题.欢迎大家多多指教.【Android-tv-widget】Android 组件,主要用于 投影仪,TV电视,手机等等A...

weixin_39861882的博客 590

新手友好!C#上位机调用YOLO实现设备异常检测(详细步骤,附踩坑指南)

C#上位机调用YOLO实现设备异常检测,核心是把“工控交互”和“AI检测”的优势结合起来,新手不用追求一步到位,先跑通基础流程,再逐步优化性能和功能。我当初也是从踩坑中过来的,只要把核心链路和细节摸透,其实门槛并没有想象中高。如果你们在实操中遇到了具体问题(比如相机取流卡顿、模型推理报错),可以在评论区留言,后续我也可以针对性拆解具体模块的完整代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 663

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

Android TV中Google语音助手获取遥控器音频的数据流程优化实践

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959847的博客 251

StarRC常见问题整理

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?使用starrc_cmd “错误代码”就能看对应Error或Warnning的解释。

m0_61544122的博客 3114

android使用Ffmpeg JNI实时播放RTSP、RTMP等视频(主码流,子码流均能流畅播放)

前言:最近 公司项目需要在电视上 播放摄像头视频,而且可以随时切换流,延时要求在500ms以内,网上试过了 各种开源库 ,都不能达到要求。于是自己找到公司C++开发人员请教,最后终于完成,在此记录,也给有需求的小伙伴提供方案。 第一步,添加ffmpeg的so库,网上有很多版本,后面我会在demo里面提供,然后这是我的CmakeList文件: # For more informati...

u011866128的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android接入FFmpeg so文件:从ABI到JNI配置的完整指南

在Android音视频开发中,native层动态库的集成是绕不开的关键环节。so文件作为ELF格式的共享对象,承载着C/C++实现的音视频引擎,其加载与链接依赖ABI匹配和JNI桥接机制。理解ABI(应用二进制接口)决定了库能否在不同CPU架构的设备上正确运行,而JNI则打通了Java层与Native层的数据通路。通过CMake配置、Gradle构建参数及合理的库加载顺序,开发者可以高效地将FFmpeg这类音视频能力集成到工程中。本文从so文件与ABI的关系出发,系统梳理了预编译库选择、CMake链接、JN

weixin_34023982的博客 284

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android集成FFmpeg so文件:从ABI原理到JNI踩坑全指南

在Android音视频开发中,native库的集成一直是个绕不开的难题。其中,FFmpeg作为最流行的多媒体处理框架,其so文件的引入更是让许多开发者头疼。要正确地将FFmpeg集成进Android工程,首先需要理解ABI(应用二进制接口)与CPU架构的对应关系——不同架构需要匹配相应的动态库,否则就会触发UnsatisfiedLinkError或dlopen failed。其次,掌握通过NDK交叉编译或使用预编译包的方式获取so文件,并合理配置Gradle的abiFilters与CMake导入规则,才能保

weixin_34184561的博客 340

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android TV语音助手深度定制指南:从AI辅助开发到生产环境部署

当我们将语音助手的NLU模块从云端迁移到本地后,虽然节省了30%的云服务成本,但模型更新频率受到了限制。这引出一个值得探讨的问题:在TV这种算力受限的设备上,如何设计动态负载均衡策略,让常用指令本地处理,长尾请求走云端?想深入实践AI与系统级开发的结合?推荐体验从0打造个人豆包实时通话AI实验,用完整项目理解语音AI的全链路实现。基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。

2600_94960238的博客 424

扫描识别Demo

本项目实现设备运维中二维码与端口条码的自动扫描功能。通过CameraX捕获图像,调用JNI层封装的ScanSDK(含mock数据模拟),依次完成二维码识别、端口匹配及条码补扫。系统支持多阶段状态管理,实时绘制检测框并提示用户操作,最终输出匹配结果。代码基于Android Studio构建,集成CMake、NDK及Kotlin,具备权限控制、图像处理与界面交互逻辑,适用于设备信息采集场景。

u012116089的博客 66

保姆级教程:5分钟在Android Studio上跑通你的第一个串口调试Demo

本文提供了一份详细的Android串口通信教程,帮助开发者在5分钟内快速搭建调试环境并跑通第一个串口调试Demo。通过使用Android-SerialPort-API库,开发者可以轻松实现串口通信功能,适用于硬件开发、工业控制等场景。

weixin_30603633的博客 366

nanopi k2 android tv,基于Nano Pi NEO4开发板的AS项目开发

基于Nano Pi NEO4开发板的AS项目开发基于Nano Pi NEO4开发板的AS项目开发Andro Studio集成Nano Pi硬件资源库打开AS,新建工程之后,打开appàsrcàmain其目录结构应该是如下样式:─ main│ ├── AndroidManifest.xml│ ├── java│ │ └── com│ │ └── friendlyarm...

weixin_29832179的博客 677

五子棋AI陪练系统:JNI+OpenCV实现亚像素级棋盘识别

五子棋训练系统本质上是博弈智能与计算机视觉的交叉实践,其核心在于将真实棋盘图像精准映射为结构化坐标数据。关键技术依赖亚像素级角点检测与单应性变换原理,通过OpenCV原生库在Android端实现毫秒级响应,显著优于纯Kotlin图像处理方案;结合JNI桥接设计,规避内存泄漏与ABI兼容风险,保障实时反馈稳定性。该技术路径不仅支撑五子棋‘活三防冲四’等专项题型的动态加载与错因回溯,更可泛化至围棋、国际象棋等棋类AI教学场景,为教育类App提供高精度、低延迟、可扩展的视觉理解底座。

weixin_34343308的博客 450
上一篇: Android JNI demo编译遇到的错误
下一篇: Android中JNI编程的那些事儿
fchyang
博客等级 码龄18年 85粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值