Android Studio3.0 JNI开发

问题:在AS3.0中通过ffmpeg解码播放资源文件中的H264格式的视频资源。

开发流程如下:

1.在AS中新建一个项目,打开项目的File-->Settings-->Android SDK-->SDK Tool,下载安装CMake,LLDB,NDK

2.回到桌面右键我的电脑-->属性-->高级系统设置-->高级-->环境变量-->Path-->编辑-->添加安装好的jdk的bin的安装目录如下

3.回到AS的项目中新建一个类Decoder.java在里面写好需要调用C/C++中的方法如下

public static native String avcodecinfo();

//创建解码对象,返回解码对象索引
public static native int init(Object CB);
//释放解码对象
public static native int deInit(int index);

4.在AS的Terminal中通过命令行的指令生成.h文件

5.AS中选中项目的根目录app右键-->New-->Folder-->JNI Folder在项目的根目录下生成名为cpp的文件夹,把上一步生成的.h文件复制到这个文件夹下面。

6.在该文件夹中新建一个.cpp的C/C++源文件,该文件中的方法名对应第四步生成的.h文件中声明的方法名,java层通过调用该文件中的方法达到调用C/C++中方法的目的。

7.AS中把需要写的C/C++文件放在第6步中新建的.cpp的文件夹中。

8.AS在Project的视图下app-->src-->main下新建名为jniLibs的文件夹,在jniLibs中新建名为armeabi和armeabi-v7a的文件夹,把需要调用的外部的.so库各复制一份相同的到这两个文件夹下。

9.把用到的.so库中的.h头文件放到.cpp文件夹中。

10.AS在Project的视图下app-->src-->main下新建名为assets的文件夹,把作为试例的.h264的资源文件放到这个文件夹下。

11.接下来使用cmake开发(AS3.0支持)需要在 module 下的 buidle.gradle 中添加以下语句

android {
    compileSdkVersion 26
    defaultConfig {
        ......
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        // For ndk-build, instead use ndkBuild {}
        externalNativeBuild {
            cmake {
                // Sets a flag to enable format macro constants for the C++ compiler.

                cppFlags "-std=c++11 -D__CORRECT_ISO_CPP_WCHAR_H_PROTO"
            }
            ndk {
                abiFilters "armeabi", "armeabi-v7a"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // 配置CMakeLists.txt路径
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"   // 设置所要编写的c源码位置,以及编译后so文件的名字
        }
    }
}

12.AS在Project视图中app下新建名为CMakeLists.txt的文件,在这个文件中添加如下内容

#cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
set(libs "${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi")

add_library(avcodec SHARED IMPORTED )
set_target_properties(avcodec PROPERTIES
    IMPORTED_LOCATION "${libs}/libavcodec-56.so")

......

add_library( # 设置so文件名称.
             Decoder
             # 设置这个so文件为共享.
             SHARED
             # 设置 c文件源码位置.
             src/main/jni/jniDecoder.cpp
             )

# Specifies a path to native header files.
include_directories(src/main/jni/include/
        src/main/jni
    )

# link_directories(src/main/jni)


find_library( # Sets the name of the path variable.
              log-lib
              log )


target_link_libraries( # 制定目标库.
                       Decoder
                       avcodec ......
                                               ${log-lib})

13.然后运行项目就可以播放.h264的视频了。可以在以下路径下找到通过上面这些步骤生成的.so文件。

app\build\intermediates\cmake\debug\obj



猜你喜欢

转载自blog.csdn.net/m782008517/article/details/79012279