Android Studio 加载第三方库

https://blog.csdn.net/minwenping/article/details/122117169

我是按照上面博主的分享尝试的,现记录一下自己遇到的问题。

  1. 我调试cmake 版本 VERSION 3.22.1
  2. 使用博主分享的 VERSION 3.18前的方法,可行;
  3. 补充两点:
    3.1 注意引入的库路径路径: $ {CMAKE_SOURCE_DIR}/…/…/…/libs/arm64-v8a/libchip.so
    宏需要加$ ,以及目录层级;
    3.2 build.gradles 需要指定ndk 描述库所对应的架构,注与路径中的arm64-v8a对应;
 defaultConfig {
        applicationId "com.example.easttest"
        minSdk 28
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk{
            abiFilters 'arm64-v8a'
        }
    }

否则会报,默认会编译四个架构(x86,x86-64,arm64-v8,armeabi-v7a)

cmd.exe /C "cd . && D:\worktool\androidsdk\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android28 --sysroot=D:/worktool/androidsdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -fno-limit-debug-info  -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--gc-sections -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,librenforlib_1.so -o C:\Users\shxy\AndroidStudioProjects\renforlib_1\app\build\intermediates\cxx\Debug\6f2b6623\obj\arm64-v8a\librenforlib_1.so CMakeFiles/renforlib_1.dir/native-lib.cpp.o  C:/Users/shxy/AndroidStudioProjects/renforlib_1/app/src/main/cpp/../../../libs/armeabi-v7a/libchip.so  D:/worktool/androidsdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/28/liblog.so  -latomic -lm && cd ."

ld: error: C:/Users/shxy/AndroidStudioProjects/renforlib_1/app/src/main/cpp/../../../libs/arm64-v8a/libchip.so is incompatible with armelf_linux_eabi

3.3 如果路径中使用${ANDROID_ABI},则ndk需要含有四种架构,且libs目录下也要有四种对应的库。
3.4 GRADLE_USER_HOME = C:\Users\shxy**.gradle**
3.5 android studio 工程路径不能有中文
3.6 编译工程选择语言Kotlin和java,编出来的C++库不能通用(java编译的只能在java工程调用,kotlin编译的只能在kotlin工程调用)。
Java:

static {
        System.loadLibrary("test3");
    }

Kotlin:

    companion object {
        // Used to load the 'test3' library on application startup.
        init {
            System.loadLibrary("test3")
        }
    }

Java调用so(Kotlin工程编译)错误如下:

2024-08-01 16:11:54.832  7615-7615  AndroidRuntime          com.example.renforlib                E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.renforlib, PID: 7615
                                                                                                    java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "chip_init" referenced by "/data/app/~~-QsN2xqCdQqmNHwFee_1tQ==/com.example.renforlib-iaJo_VsTdzuarjYJQsJCIw==/base.apk!/lib/arm64-v8a/librenforlib.so"...
                                                                                                    	at java.lang.Runtime.loadLibrary0(Runtime.java:1087)
                                                                                                    	at java.lang.Runtime.loadLibrary0(Runtime.java:1008)
                                                                                                    	at java.lang.System.loadLibrary(System.java:1664)
                                                                                                    	at com.example.renforlib.MainActivity.<clinit>(MainActivity.java:18)
                                                                                                    	at java.lang.Class.newInstance(Native Method)
                                                                                                    	at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
                                                                                                    	at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
                                                                                                    	at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
                                                                                                    	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3388)
                                                                                                    	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3648)
                                                                                                    	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
                                                                                                    	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                                                                                                    	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2116)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                    	at android.os.Looper.loop(Looper.java:223)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:7723)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)

总结:以上只是会为了调试结果而写的记录,没有仔细分析原理。

Android Studio 最新版与Android Studio 2022 区别:

  1. setting.gradle.kts 与 setting.gradle
添加镜像
最新版:
maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }
2022:
 maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
  1. build.gradle.kts 与 build.gradle
最新版:
id("com.android.application") version "8.0.0" apply false
2022:
id 'com.android.application' version '8.0.0' apply false
  1. app/build.gradles.kts 与app/build.gradles
最新版:
ndk{
            abiFilters.addAll(arrayOf("arm64-v8a"))
        }
2022:
ndk{
            abiFilters 'arm64-v8a'
        }

注:

  1. 使用C++去写一个动态库,由于C++编译器对于函数的符号的生成需要进行名字修饰处理,然后生成的函数符号不再跟源代码中定义的函数名一致;
  2. JVM调用的native接口/接口导致通过函数名去调用函数时(用函数名充当函数符号去查找函数地址),将会找不到具体的实现,然后崩溃;
  3. 所以使用C++去写navtive的接口时,需要用extern “C” 包住native接口,这样就显示告诉C++编译器,对于我们的接口/函数使用C语言的方式(函数符号即函数名称)去编译代码和生成函数符号。
  4. 由于JNI native_lib.cpp由C++编译器并编译,需要在库的头文件加上extern "C"声明,保证编译时函数名与源代码一致。
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
......
int chip_init();
......
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过以下步骤导入第三方库: 1.在项目的build.gradle文件中添加maven仓库地址,例如: ``` allprojects { repositories { // ... 省略其他仓库地址 ... maven { url 'https://jitpack.io' } // jitpack仓库地址 } } ``` 2.在需要使用库的module的build.gradle文件中添加依赖,例如: ``` dependencies { // ... 省略其他依赖 ... implementation 'com.github.username:libraryname:version' // jitpack仓库中库的地址 } ``` 其中,`username`是发布库的GitHub账户名,`libraryname`是库的名称,`version`是库的版本号。 ### 回答2: Android StudioAndroid开发者必备的一款开发工具,也是Google官方支持的Android开发工具。其中,导入第三方库Android开发过程中常见且重要的操作,本文将针对这一操作进行详细讲解。 一、手动导入第三方库 1.将第三方库复制到项目中 将下载好的库文件拷贝到项目的libs文件夹下,如下图所示: 2.在gradle文件中添加依赖项 打开项目的build.gradle文件,并在dependencies标签内添加所需要的库依赖,如下所示: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.+' compile project(':yourlibrary') } 其中,compile fileTree(dir: 'libs', include: ['*.jar'])表示从libs文件夹下引入所有.jar文件为依赖项;compile 'com.android.support:appcompat-v7:23.0.+'表示引入Android官方支持库;compile project(':yourlibrary')表示引入自定义库。 二、使用Android Studio快捷导入第三方库 1.使用Maven或JCenter库 在build.gradle文件中添加依赖项时,可以直接搜索Maven或JCenter库,选择需要引入的库版本即可,如下所示: repositories { mavenCentral() jcenter() } dependencies { compile 'com.android.support:appcompat-v7:23.0.+' } 2.使用Android Studio插件 在Android Studio中可以安装插件,来更加便捷地导入第三方库。比如,Google官方出品的插件Android Drawable Importer,用来导入drawable资源,使用起来非常方便。 以上就是关于在Android Studio中导入第三方库的方法,需要注意的是,在替换原有库版本时要自行检测版本兼容性,以防止出现不必要的错误。 ### 回答3: 在使用Android Studio开发Android应用时,经常需要借助第三方库来完成某些功能。这些第三方库一般由其他开发者或组织开发并发布在网络上,我们可以通过导入这些库来使用它们提供的功能和类。 以下是导入第三方库的一般流程: 1. 在Gradle中添加库的依赖关系 Gradle是一个构建自动化工具,它是Android Studio的构建系统。通过添加库的依赖关系,Gradle会自动下载并导入库的相关文件。依赖关系一般添加在app/build.gradle文件中的dependencies选项中。 例如,如果要使用Google的Material Design库,可以在dependencies中添加: ``` dependencies { // ... implementation 'com.google.android.material:material:1.3.0' // ... } ``` 2. 使用第三方库 一旦依赖关系已经设置好,就可以开始使用第三方库了。使用库的方法根据库的文档而定,一般在应用程序的Java代码中引用库的类或函数即可。 例如,使用Material Design库的TextView,需要在XML文件中设置样式: ``` <com.google.android.material.textview.MaterialTextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> ``` 3. 解决导入库时的问题 有时候可能会遇到导入库时的错误,比如依赖库版本不兼容、下载速度慢等。这时候可以尝试以下方法解决问题: - 更新Gradle版本 - 检查依赖关系版本是否正确 - 修改Gradle的下载镜像源加速下载 - 使用Proxy或VPN提高下载速度 在使用第三方库时,我们需要注意一些细节,比如要遵守库的许可证、避免库的冲突等。同时,不仅要会使用第三方库,还要学会如何开发和分享自己的库,这样才能成为一名优秀的Android开发者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值