【问题标题】:How to import and use .so file in NDK project ( Android Studio )如何在 NDK 项目 ( Android Studio ) 中导入和使用 .so 文件
【发布时间】:2018-07-19 07:34:14
【问题描述】:

我正在尝试在 android studio NDK 项目中导入和使用 .so 文件。我已经阅读了 android studio 的文档、不同的博客和 StackOverflow 上的答案,但没有一个对我有用,因为它们中的大多数都已过时(3-4 年前写或问过)。也无法遵循文档。

请帮忙!

【问题讨论】:

    标签: android-studio android-ndk .so libnodave


    【解决方案1】:

    (我假设 .so 文件是使用 Android NDK 为 Android 构建的。如果不是,这将不起作用,您需要使用 Android NDK 重建 .so 文件的源代码)

    假设您有一个名为 native-lib 的库,该库是为 ARMv7A 架构构建的,并且您已将其放置在 app/prebuilt_libs/armeabi-v7a/ 中。

    app/build.gradle:

    android {
        ...
        defaultConfig {
            ...
            ndk {
                abiFilters "armeabi-v7a"
            }
        }
        ...
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
        sourceSets.main {
            jniLibs.srcDirs = ['prebuilt_libs']
        }
    

    app/CMakeLists.txt

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library(lib_native SHARED IMPORTED)
    set_target_properties(lib_native PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/${ANDROID_ABI}/libnative-lib.so)
    

    如果要从 Java 中使用该库

    CallNative.java:

    package com.example.foo;  // !! This must match the package name that was used when naming the functions in the native code !!
    
    
    public class CallNative {  // This must match the class name that was used when naming the functions in the native code !!
        static {
            System.loadLibrary("native-lib");
        }
        public native String myNativeFunction();
    }
    

    例如,如果本机库有一个函数JNIEXPORT jstring JNICALL Java_com_example_bar_MyClass_myNativeFunction,则Java 类必须命名为MyClass 并位于包com.example.bar 中。


    如果该库打算由其他本机库使用

    您需要该库的头文件 (*.h)。如果您没有,则必须自己弄清楚如何编写。

    然后将其添加到您的 CMakeLists.txt 中:

    set_target_properties(lib_native PROPERTIES INCLUDE_DIRECTORIES directory/of/header/file)
    

    对于其他使用 libnative-lib.so 的原生库:

    target_link_libraries(other_native_lib lib_native)
    

    【讨论】:

    • 我们如何知道 .so 文件是为 android 构建的?如果 .so 文件不是为 android 构建的,我们如何为 android 创建一个?非常感谢您的帮助
    • @vardanKaushik:嗯,你从哪里得到的?如果它不是来自某个 Android 项目,那么它很可能不适合在 Android 上使用。在这种情况下,您将需要库的源代码和build it in the usual way
    • 我想使用 libnodave 库,它用于 s7 plc 和 android 之间的通信,我下载了它的源代码,它包含一个 .so 文件,但它没有指定这个 .so 文件构建的任何内容安卓与否
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2014-02-13
    • 2021-08-09
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多