首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NDK项目( Android )中导入和使用.so文件

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

Stack Overflow用户
提问于 2018-07-19 07:34:14
回答 1查看 2.6K关注 0票数 1

我试图在项目中导入和使用.so文件。我在StackOverflow上读过android的文档、不同的博客和答案,但是没有一个对我有用,因为其中大多数都过时了( 3-4年前写的或者问过)。也无法跟踪文档。

请帮帮忙!

EN

回答 1

Stack Overflow用户

发布于 2018-07-19 09:20:44

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

假设您已经有了一个为ARMv7A体系结构构建的名为本机库的库,并将它放在app/prebuilt_libs/armeabi-v7a/中。

应用程序/build.gradle:

代码语言:javascript
复制
android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets.main {
        jniLibs.srcDirs = ['prebuilt_libs']
    }

app/CMakeLists.txt

代码语言:javascript
复制
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:

代码语言:javascript
复制
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,则必须将该类命名为MyClass并位于包com.example.bar中。

如果该库打算由其他本机库使用,则为。

您需要一个库的头文件(*.h)。如果你没有一个,你就得自己想办法写一个。

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

代码语言:javascript
复制
set_target_properties(lib_native PROPERTIES INCLUDE_DIRECTORIES directory/of/header/file)

对于使用lib本机-lib.so的其他本机库:

代码语言:javascript
复制
target_link_libraries(other_native_lib lib_native)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51416866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档