如何在jni中链接预构建

how to link prebuild so in jni

本文关键字:链接 构建 jni      更新时间:2023-10-16

我创建了一个头文件"abc.h",声明

int abc();
然后,我创建了一个.cpp文件"abc.cpp",定义为
int abc()
{ 
  return 10;
}
现在我创建了一个库libabc。

我已经创建了一个HelloWorld Android项目。然后,我在jni中创建了一个lib文件夹,并将libabc。

现在我在jni文件夹中创建了另一个文件"xyz.cpp",想要使用abc()函数。但是当我运行ndk-build命令时,我得到这个错误。Error: undefined reference to function abc .

这是xyz.cpp文件。

int getAbcFunction()
{
    int value = abc();
    // return value;
}

Android。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := abc-prebuild
LOCAL_SRC_FILES := libabc.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

Android。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE    := helloworld
LOCAL_SRC_FILES := xyz.cpp
LOCAL_SHARED_LIBRARIES := abc-prebuild
include $(BUILD_SHARED_LIBRARY)

如何解决这个错误

#include "abc.h"添加到xyz.cpp的开头

如果你使用的是Android Studio,默认情况下你的makefile文件会被忽略,因为所有的配置都是使用gradle或gradle-experimental插件进行的。

然而,这些工具还不支持本地预构建,因此您应该停用默认支持并自己调用ndk-build:

android.sources{
    main.jni {
        source {
            srcDirs 'src/main/none' //deactivate built-in compilation
        }
    }
    main.jniLibs {
        source {
            srcDir 'src/main/libs' //integrate .so files from src/main/libs
        }
    }
}

顺便说一句,这与你的问题并不完全相关,但你有:

LOCAL_SRC_FILES := libabc.so

这意味着你打算对NDK支持的所有架构(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64)使用这个预构建(armeabi?),即使它们不兼容。你应该做

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libabc.so