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

Android studio 如何在NDK项目(Android Studio)中导入和使用.so文件,android-studio,android-ndk,.so,libnodave,Android Studio,Android Ndk,.so,Libnodave,我正在尝试导入并使用android studio NDK项目中的.so文件。我已经阅读了android studio的文档、不同的博客以及StackOverflow上的答案,但是没有一个对我有用,因为大多数都是过时的(3-4年前写的或问的)。也无法按照文档进行操作 请帮忙 (我假设.so文件是使用Android NDK为Android构建的。如果不是,这将不起作用,您将需要源代码来使用Android NDK重建.so文件) 假设您有一个名为native lib的库,它是为ARMv7A体系结构构建

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

请帮忙

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

假设您有一个名为native lib的库,它是为ARMv7A体系结构构建的,您已经将它放在app/prebuild_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\u com\u example\u bar\u MyClass\u 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创建一个呢?非常感谢你的支持help@vardanKaushik:嗯,你是从哪儿弄来的?如果它不是来自某个Android项目,那么它很可能不适合在Android上使用。在这种情况下,您将需要库的源代码。我想使用用于s7 plc和android之间通信的libnodave库,我下载了它的源代码,其中包含一个.so文件,但它没有指定此.so文件是否为android构建