JNI 引入我的MediaAndroid项目

首先在包的main下面创建cpp文件夹

CMakeLists.txt文件

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.10.2)# Declares and names the project.
# 改这里,项目名小写
project("mediaandroid")# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.# 改这里,项目名小写
add_library( # Sets the name of the library.mediaandroid# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.# 改这里,项目名小写
target_link_libraries( # Specifies the target library.mediaandroid# Links the target library to the log library# included in the NDK.${log-lib})

Native-lib.cpp

#include <jni.h>
#include <string>extern "C" JNIEXPORT jstring JNICALL
//注意这里是包名_Activity
Java_cn_com_codingce_mediaandroid_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}

MainActivity

package cn.com.codingce.mediaandroid;import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import cn.com.codingce.mediaandroid.activity.AACActivity;
import cn.com.codingce.mediaandroid.activity.AudioPCMRenderActivity;
import cn.com.codingce.mediaandroid.activity.ByteBufferActivity;
import cn.com.codingce.mediaandroid.activity.CameraRenderActivity;
import cn.com.codingce.mediaandroid.activity.InkeMainActivity;
import cn.com.codingce.mediaandroid.activity.M4AActivity;
import cn.com.codingce.mediaandroid.activity.MP4ParseAACActivity;
import cn.com.codingce.mediaandroid.activity.MP4ParsePCMActivity;
import cn.com.codingce.mediaandroid.activity.PCMActivity;
import cn.com.codingce.mediaandroid.activity.SurfaceActivity;/*** 采集 → 编码 → 封装 → 解封装 → 解码 → 渲染* <p>* 跳转其他功能*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private final String TAG = this.getClass().getSimpleName();// Used to load the 'mediaandroid' library on application startup. 这里static {System.loadLibrary("mediaandroid");}Button main_btn, main_btn1, main_btn2, main_btn3,main_btn4, main_btn5, main_btn6, main_btn7, main_btn8, inke_btn;@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//        PerMissionSet.requestPermission(this);Log.e(TAG, "JNI" + stringFromJNI());//音频录制权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions((Activity) this,new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},1);}//存储权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions((Activity) this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},1);}//摄像头权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ||ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions((Activity) this,new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},1);}main_btn = findViewById(R.id.main_btn);main_btn.setOnClickListener(this);main_btn1 = findViewById(R.id.main_btn1);main_btn1.setOnClickListener(this);main_btn2 = findViewById(R.id.main_btn2);main_btn2.setOnClickListener(this);main_btn3 = findViewById(R.id.main_btn3);main_btn3.setOnClickListener(this);main_btn4 = findViewById(R.id.main_btn4);main_btn4.setOnClickListener(this);main_btn5 = findViewById(R.id.main_btn5);main_btn5.setOnClickListener(this);main_btn6 = findViewById(R.id.main_btn6);main_btn6.setOnClickListener(this);main_btn7 = findViewById(R.id.main_btn7);main_btn7.setOnClickListener(this);main_btn8 = findViewById(R.id.main_btn8);main_btn8.setOnClickListener(this);//集成映客sdkinke_btn = findViewById(R.id.inke_btn);inke_btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v.getId() == main_btn.getId()) {Intent intent = new Intent();intent.setClass(this, PCMActivity.class);startActivity(intent);}if (v.getId() == main_btn1.getId()) {Intent intent = new Intent();intent.setClass(this, AACActivity.class);startActivity(intent);}if (v.getId() == main_btn2.getId()) {Intent intent = new Intent();intent.setClass(this, M4AActivity.class);startActivity(intent);}if (v.getId() == main_btn3.getId()) {Intent intent = new Intent();intent.setClass(this, MP4ParseAACActivity.class);startActivity(intent);}if (v.getId() == main_btn4.getId()) {Intent intent = new Intent();intent.setClass(this, MP4ParsePCMActivity.class);startActivity(intent);}if (v.getId() == main_btn5.getId()) {Intent intent = new Intent();intent.setClass(this, AudioPCMRenderActivity.class);startActivity(intent);}if (v.getId() == main_btn6.getId()) {Intent intent = new Intent();intent.setClass(this, CameraRenderActivity.class);startActivity(intent);}if (v.getId() == main_btn7.getId()) {Intent intent = new Intent();intent.setClass(this, SurfaceActivity.class);startActivity(intent);}if (v.getId() == main_btn8.getId()) {Intent intent = new Intent();intent.setClass(this, ByteBufferActivity.class);startActivity(intent);}if (v.getId() == inke_btn.getId()) {Intent intent = new Intent();intent.setClass(this, InkeMainActivity.class);startActivity(intent);}}@Overrideprotected void onDestroy() {//销毁super.onDestroy();}/*** 这个方法* A native method that is implemented by the 'mediajni' native library,* which is packaged with this application.*/public native String stringFromJNI();}

build.gradle 配置(app下面)


plugins {id 'com.android.application'
}android {compileSdk 32defaultConfig {applicationId "cn.com.codingce.mediaandroid"minSdk 21targetSdk 32versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"#加这个externalNativeBuild {cmake {cppFlags '-std=c++14'}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}#加这个externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.10.2'}}#加这个buildFeatures {viewBinding true}
}dependencies {implementation 'androidx.appcompat:appcompat:1.4.1'implementation 'com.google.android.material:material:1.6.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.3'androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

ndk

ndk.dir=/Users/inke219223m/dev/android-ndk-r21e

当然你也可以根据新创建的项目摘出来

别忘了释放资源,有些资源需要自己手动释放,避免内存泄露,本例子仅作导入

【音视频】JNI 引入Android项目相关推荐

  1. ffmpeg sdk java_推荐一个强大的音视频处理的开源项目!

    原标题:推荐一个强大的音视频处理的开源项目! 1.前景提要 在我们的开发中,经常会用到音视频相关内容,一般我们都会选择FFmpeg,但是其交叉编译对于我们来说是一件很麻烦的事情.所以这里方便日后使用就 ...

  2. android音视频工程师,音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)...

    ## 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源) ## 视音频编辑器 ## 前言 有时候我们想对音视频进行加工处理,比如视频编辑.添加字幕.裁剪等功能处 ...

  3. Android 音视频开发(六) -- Android Mediaprojection 截屏和录屏

    Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍照功能 Andro ...

  4. java音视频处理类,Android Java实时音视频SDK自定义视频前处理功能 - 开发者中心 - ZEGO即构科技...

    自定义视频前处理 更新时间:2021-02-07 17:47 1 功能简介 当 SDK 自带的美颜无法满足需求,例如需要做挂件.贴纸,或者美颜效果无法达到预期时,推荐开发者使用自定义视频前处理功能.该 ...

  5. android 视频沉浸式,Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果...

    原文: Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果 需求: 手机app ,当打游戏或者全屏看视频的时候会发现这时候手机顶部的状态栏是不显示的,当我们从手机顶端向下进行滑动或 ...

  6. Android音视频编辑库,Android音视频处理.pdf

    Android音视频处理 Android 视频处理 沈青海 admin@3 Copyright 2008-2009 Farsight. All rights reserved. 频处理 } Media ...

  7. 怎么让抖音视频当做铃声android,抖音怎么提取视频里的音乐?怎么将抖音里的音乐用来做手机铃声?抖音视频提取音频的方法...

    虽然说抖音发展到现在,褒贬不一,但是架不住人家火啊,现在的人大都喜欢捧着个手机刷抖音,来打发一些碎片时光.抖音不仅带火了短视频,同样也带火了视频里面的背景音乐,许多我们平时并没有听过的歌曲在抖音上就慢 ...

  8. Android 简单的视频录制,android项目实战手机安全卫士

    */ public static Camera getDefaultCamera(int <Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义> [docs. ...

  9. 安卓音视频开发!Android开发还会吃香吗?大厂直通车!

    导语 又到了面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,Android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前门槛那么低 ...

最新文章

  1. 【每周CV论文推荐】 初学目标检测必须要读的文章
  2. uniapp底部弹出框效果
  3. Pygame 整活五子棋
  4. 华硕台式机安装linux进不去系统,[已解决]求助,无法进入系统
  5. 华为机试——数字颠倒
  6. 商汤科技「工业视觉AI」研发介绍
  7. zuul zuul2 性能_我们学习如何构建Zuul CI / CD云
  8. java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接
  9. Python机器学习:KNN算法06网格搜索
  10. 特斯拉:在行驶20万英里后 其电动汽车电池仍有90%容量
  11. 使用git可视化工具上传你修改的代码
  12. Defaulting to user installation because normal site-packages is not writeable
  13. 银河帝国----基地边缘
  14. 献给面试学生 关键字const是什么意思 ESP(译者:Embedded Systems Programming) --Dan Saks概括了const的所有用法
  15. 梦想学院计算机,菲梦学院电脑版
  16. C# Behavior Tree -- 行为树
  17. [系统安全] 二十二.PE数字签名之(下)微软证书漏洞CVE-2020-0601复现及Windows验证机制分析
  18. linux 重新运行命令,如何在Linux中重新运行最后执行的命令?
  19. IGES格式文件分析 / IGES File Format
  20. 联通3g升级4g显示无服务器,中国联通回应关闭2G3G信号 协助2G用户向3G4G网络升级方案 移动关闭2G3G了吗...

热门文章

  1. 《SGX ECALL》汇总
  2. [自注意力神经网络]Segment Anything(SAM)论文阅读
  3. 安徽省计算机2级考试试题,安徽省计算机二级VFP考试理论模拟试题2(附答案)!!!!!!!!...
  4. video 满屏显示_video作为背景全屏铺满问题
  5. 互联网+重点路桥建设智慧工地综合监管平台
  6. 【XSY3344】连续段 DP 牛顿迭代 NTT
  7. 计算机考试电脑故障考官说没事,山东春季高考潍坊一考点计算机故障 官方启动调查...
  8. 使用ffmpeg将GoPro长延时的jpg照片转换成视频文件(一条命令)
  9. ERP中物料删除与停用
  10. USB Camera Driver issue