#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 чтобы найти их