Исключение DllNotFound — в чем проблема?

#unity3d

#unity3d

Вопрос:

Я столкнулся со странной проблемой — у меня есть 2 библиотеки, которые я поместил под AssetsPluginsAndroid , имя первой библиотеки — mylibrary , а второй — libtetdecoder .

Затем я пытаюсь использовать их таким же образом и вижу, что могу вызывать методы из первого и не могу из второго, из-за этой ошибки

     (Filename: <d25e5b88a8b44b89b27c70e01a22f338> Line: 0)
2020-09-15 09:39:53.243 26169-26207/? E/Unity: DllNotFoundException: libtetdecoder
        at (wrapper managed-to-native) TestScript.foolib()
      at TestScript.Update () [0x00021] in <d25e5b88a8b44b89b27c70e01a22f338>:0 
  

Вот как я использую эти библиотеки:

 using UnityEngine;
using System.Runtime.InteropServices;
using UnityEngine.UI;
using System.Globalization;

public class TestScript : MonoBehaviour
{
    public Text myText;
    public Text myText2;
    private const string pluginNameFirst = "mylibrary";
    private const string pluginNameSecond = "libtetdecoder";

    //native interface
    [DllImport(pluginNameFirst)]
    private static extern int foo();

    //native interface
    [DllImport(pluginNameSecond)]
    private static extern int foolib();

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        int i = foo();
        myText.text = "HERE : "   i;

        int il = foolib();
        myText2.text = "HERE : "   il;
    }
}
  

В чем возможная проблема?

Редактировать

Скриншоты обоих инспекторов DLL

введите описание изображения здесь

введите описание изображения здесь

ПРАВКА2

Я обнаружил, что вполне возможно, что моя библиотека имеет общую зависимость, и в этом случае мне нужно добавить эти общие библиотеки вместе с моим .arr файлом, я добавил отсутствующую библиотеку, но в любом случае проблема та же.

Существует CMakeList.txt файл. Это показывает, как я создаю эту библиотеку

 cmake_minimum_required(VERSION 3.4.1)

set(pathToOpenCv $ENV{OPEN_CV_PATH})
set(CMAKE VERBOSE MAKEFILE on)
set(CMAKE CXX FLAGS "${CMAKE_CXX_FLAGS} -std=gnu  11")

set(OBOE_DIR ../../oboe)

# Set the path to the parserTet library directory
set(PARSER_TET_DIR ../../../tetavi_main/TV_Infrastructure/Tier1.0/TV_TetFileCodec)
set(PARSER_GWS_DIR ../../../tetavi_main/TV_Infrastructure/Tier1.0/GWStdLib)

include_directories(${pathToOpenCv}/sdk/native/jni/include)
add_library(lib_opencv SHARED IMPORTED)
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION
        ${pathToOpenCv}/sdk/native/libs/${CMAKE_ANDROID_ARCH_ABI}/libopencv_java3.so)

# Add the Oboe library as a subproject. Since Oboe is an out-of-tree source library we must also
# specify a binary directory
add_subdirectory(${OBOE_DIR} ./oboe-bin)

# Include the Oboe headers and shared sample code
include_directories(${OBOE_DIR}/include ${OBOE_DIR}/samples/shared)

set(libdecodersource
        src/main/cpp/jni_interface_tet_decoder.cpp
        src/main/cpp/native_codec/texture_codec.cc
        )

add_library( # Sets the name of the library.
        libtetdecoder

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        ${libdecodersource})

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

target_include_directories(libtetdecoder PUBLIC src/main/cpp/include)
target_include_directories(libtetdecoder PRIVATE src/main/cpp)

# libtetcodec
set(tet_codec_source
        ${PARSER_TET_DIR}/TV_TetDecoder/TV_MtrDecoder.cpp
        ${PARSER_TET_DIR}/TV_TetDecoder/TV_TetDecoder.cpp
        ${PARSER_TET_DIR}/TV_TetDecoder/TV_TetDecoderImpl.cpp
        ${PARSER_TET_DIR}/TV_TetDecoder/TV_TetChunkBuffers.cpp
        ${PARSER_TET_DIR}/TV_TetShared/TV_TetTexture.cpp
        ${PARSER_GWS_DIR}/GWS_Basics.cpp)

add_library(libtetcodec SHARED ${tet_codec_source})

# Include parserTet headers
include_directories(${PARSER_TET_DIR})
include_directories(${PARSER_GWS_DIR})

target_compile_options(libtetdecoder PRIVATE
        "$<$<CONFIG:RELEASE>:-O3>"
        "$<$<CONFIG:DEBUG>:-O0>")

target_compile_options(libtetcodec PRIVATE
        "$<$<CONFIG:RELEASE>:-O3>"
        "$<$<CONFIG:DEBUG>:-O0>")

target_compile_definitions(libtetcodec PRIVATE IS_LIB_TET_CODEC_DEBUG_MODE=false)

target_link_libraries( # Specifies the target library.
        libtetdecoder
        libtetcodec
        oboe
        lib_opencv
        mediandk
        android
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})
  

Итак, совместно объявлены следующие библиотеки libtetdecoder , libtetcodec и lib_opencv после сборки я вижу, что все эти библиотеки включены в мою основную библиотеку, ничего не пропало.

введите описание изображения здесь

Комментарии:

1. Как указано в исключении, указанный импорт DLL не может быть найден. Если первый вызов работает, а второй нет, это означает, что по какой-то причине он не смог найти указанную DLL. Проверьте ваше именование, компиляцию и т.д. В любом случае здесь недостаточно информации, чтобы дать вам полный ответ.

2. @Ron похоже, что с именованием все в порядке. Я не понял, когда вы имели в виду compiling . Кстати, какая дополнительная информация может быть полезна здесь, чтобы выяснить, в чем проблема?

3. Происходит ли это на определенной платформе? Можете ли вы добавить скриншоты обоих инспекторов DLL в Unity?

4. @Ron отредактировал мой вопрос, пожалуйста, взгляните — edit и edit2

5. возможно, у вас отсутствуют зависимости? Я знаю, что для Windows вы могли использовать dependencywalker.com чтобы найти их