AndroidStudio 如何引入第三方so库【最新亲测可行】

在做Android JNI 或者NDK混合开发调试的时候,用AndroidStudio 的效率明显要高于在Android 源码中用Android.mk的编译so,push到机器 上测试。源码增量编译时间和来回替换时间效率太低了,尤其是碰到服务器很卡的时候,简直要命。

而且在AndroidStudio中开发c/c++的提示功能明显要好于在vs code中的提示情况。AndroidStudio时如此的丝滑和流程,所以我就把这种c/c++ 混合java 的开发调试全部挪到本地。

CSDN 上流传最多的一篇链接:Android studio使用CMake引入第三方so库及头文件_android studio c++ 使用cmake 引用外部opencv so库的demo-CSDN博客其实在版本上不适用,而且还是打马赛克的,我的天啊!

首先看测试的so 的源文件和头文件:

//
// Created by minwenping on 2021/12/23.
//

#ifndef NATIVETEST_OTHERS_H
#define NATIVETEST_OTHERS_H

char * getRealName();

int age();

#endif //NATIVETEST_OTHERS_H
//
// Created by minwenping on 2021/12/23.
//


#include "others.h"

char * getRealName(){
    return  "this is the world!";
}

int age(){
    return  99;
}

我看了主要的问题都是编译问题,而编译问题的产生都是因为引用不到第三方so。那么so放置的位置有两种:

 放在这个位置的时候,build.gradle 的配置如下:

 那么它的CMake的配置方式就和其他的位置差不多

在本地工程cpp文件中使用

#include <jni.h>
#include <string>


#include "include/others.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_wenping_nativeso_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";

    std::string result =getRealName();

    return env->NewStringUTF(result.c_str());
}


extern "C"
JNIEXPORT jint JNICALL
Java_com_wenping_nativeso_MainActivity_getNumber(JNIEnv *env, jobject thiz) {
    return  age();
}

添加最近更新,发现AndroidStudio 和CMake更新后之前的写法会导致编译失败,无法编译通过,下面是更新新版本的写法,CMake升级到3.18后宏函数写法发生改变

//下面是引用第三方so库

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android Studio引入第三方C++的步骤如下: 1. 将第三方的源代码放入项目的jni目录下,例如:`/app/src/main/jni/third_party_lib/`。 2. 在项目的`build.gradle`文件中添加以下代码: ```gradle android { // ... defaultConfig { // ... externalNativeBuild { cmake { cppFlags "-std=c++11 -frtti -fexceptions" abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } } // ... } // ... externalNativeBuild { cmake { path "CMakeLists.txt" } } ``` 其中,`path`指定了CMakeLists.txt文件的路径,`cppFlags`指定了编译选项,`abiFilters`指定了支持的CPU架构。 3. 在项目的`CMakeLists.txt`文件中添加以下代码: ```cmake add_library(third_party_lib SHARED IMPORTED) set_target_properties(third_party_lib PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party_lib/libthird_party_lib.so) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party_lib/include) ``` 其中,`add_library`指定了的名称,`IMPORTED`表示这是一个外部,`IMPORTED_LOCATION`指定了文件的路径,`include_directories`指定了头文件的路径。 4. 在JNI代码中调用第三方的函数。 ```c++ #include "third_party_lib/include/third_party_lib.h" extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_callThirdPartyLib(JNIEnv* env, jobject /* this */) { ThirdPartyLib thirdPartyLib; std::string result = thirdPartyLib.doSomething(); return env->NewStringUTF(result.c_str()); } ``` 其中,`third_party_lib/include/third_party_lib.h`是第三方的头文件,`ThirdPartyLib`是第三方的类,`doSomething`是第三方的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值