如何在NDK项目(Android Studio)中导入和使用.so文件

时间:2018-07-19 07:34:15

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

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

请帮助!

1 个答案:

答案 0 :(得分: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)