Android Studio cmake和jni的一些坑


1.路径

修改前CMakeLists.txt动态库配置部分

add_library( avcodec-57
             SHARED
             IMPORTED )

set_target_properties( avcodec-57
                       PROPERTIES IMPORTED_LOCATION
                       libs/armeabi/libavcodec-57.so )

执行后出错

Error while executing 'D:\Android\Sdk\cmake\3.6.3155560\bin\cmake.exe' with arguments {--build E:\MyApplication2\app\.externalNativeBuild\cmake\debug\armeabi --target native-lib}
ninja: error: 'libs/armeabi/libavcodec-57.so', needed by '../../../../build/intermediates/cmake/debug/obj/armeabi/libnative-lib.so', missing and no known rule to make it

在提示信息可以看出编译时的路径为

E:\MyApplication2\app\.externalNativeBuild\cmake\debug\armeabi

因此在CMakeList.txt中增加一个配置,即CMakeList.txt所在的目录

set(CURRENT_DIR ${CMAKE_SOURCE_DIR})

//在Gradle Console输出信息
//CMAKE_SOURCE_DIR: E:/MyApplication2/app
message("CURRENT_DIR:" ${CMAKE_SOURCE_DIR})

add_library( avcodec-57
             SHARED
             IMPORTED )

set_target_properties( avcodec-57
                       PROPERTIES IMPORTED_LOCATION
                       ${CURRENT_DIR}/libs/armeabi/libavcodec-57.so )

2.使用cpp开发时的extern “C”

//file native-lib.cpp
#include <jni.h>
#include <string>
//用extern "C"将C库的头文件和代码用{}括起来
extern "C"
{
//ffmpeg使用c开发,所以头文件要用extern "C"声明
#include "libavcodec/avcodec.h"
jstring
Java_com_jesure_myapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    char info[10000] = {0};
    sprintf(info, "%s\n", avcodec_configuration());
    //cpp中的JNIEnv是一级指针,在c中是二级指针
    //在c中下面语句写为 return (*env)->NewStringUTF(info);
    return env->NewStringUTF(info);
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值