system.entrypointnotfoundexception в ‹Имя файла неизвестно› в Unity3d

Я пытаюсь вызвать простую встроенную функцию (C ++) из Unity3D. Я сделал следующее:

  1. Поместил libMSDKWrapper.so в Assets-> Plugins-> Android.

  2. Это мой код на C #

    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    public class facebooktest : MonoBehaviour {
    
        [DllImport ("MSDKWrapper")]
        private static extern long getContextNative();
    
        void Start () {
            Debug.Log("Hello, World!");
            long context = getContextNative(); // <-- Exception thrown here
            Debug.Log(context);
            }
    }
    

Я получаю следующее исключение:

system.entrypointnotfoundexception в [0x00000] в неизвестном имени файла: 0

Я использовал тот же libMSDKWrapper.so с использованием java с помощью команды

System.loadLibrary ("MSDKWrapper");

и я смог получить доступ и использовать метод getContextNative ().

Изменить 1: я разархивировал содержимое apk и обнаружил, что файл libMSDKWrapper.so присутствует в test.apk / lib / armeabi-v7a

Изменить 2: Вот журналы logcat. 03-25 11:40: 17.543: D / dalvikvm (26176): Попытка загрузить lib /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40: 17.568: D / MSDK (26176): Провайдер регистрации: SN_COMMUNITY 03-25 11: 40: 17.568: D / MSDK (26176): Провайдер регистрации: SN_FACEBOOK 03-25 11: 40: 17.568: D / dalvikvm (26176): Добавлены общие библиотеки lib / data /data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11: 40: 17.568: I / MSDK (26176): JNI_OnLoad звонил 03-25, 11: 40: 17.573: D / dalvikvm (26176) : Пытаюсь загрузить библиотеку /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11: 40: 17.573: D / dalvikvm (26176): Общая библиотека '/ data / data / com. disney.citygirl.goo/lib/libMSDKWrapper.so 'уже загружен в том же CL 0x41566348 03-25 11: 40: 17.598: I / Unity (26176): System.EntryPointNotFoundException: getContextNative 03-25 11: 40: 17.598: I / Unity (26176): at (оболочка, управляемая-нативной) SocialAccess: getContextNative () 03-25 11: 40: 17.598: I / Unity (26176): at SocialAccess.OnClick () [0x00000] в: 0 03-25 11: 40: 17.598: I / Unity (26176):
03-25 11: 40: 17.598: I / Unity (26176): (Имя файла: ./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp Строка: 43)


person Pradeep Vairamani    schedule 22.03.2013    source источник
comment
Нам нужно увидеть реализацию .dll. Возможно, отсутствует зависимость.   -  person Jerdak    schedule 22.03.2013


Ответы (2)


Вы используете плагин C ++, но, возможно, ваша версия Unity3D его не поддерживает? Напоминаю, что для этого вам понадобится Pro.

Эта страница может предоставить решение.

person Daniel A.A. Pelsmaeker    schedule 22.03.2013
comment
Это была страница, за которой я следил. У меня тоже есть 30-дневная ознакомительная версия unity pro. - person Pradeep Vairamani; 22.03.2013

Убедитесь, что вы используете директиву extern 'c', чтобы избежать проблем с изменением имен . Если вы не «оборачиваете» свои вызовы именами методов «c», вы получите именно такое поведение, потому что компилятор C ++ «искажает» или добавляет дополнительный архитектурно-зависимый «мусор» к именам методов. Если у вас есть вопросы, вы можете обратиться к моему проекту github ЗДЕСЬ

Сосредоточьтесь на main.cpp (точка входа в android-src / такая же, как и в корне). Это шаблон, который вам понадобится для моделирования вашей dll c ++ после. Этот проект также покажет вам, как создать dll c ++ для android. Посмотрите в README полные инструкции по сборке как для Ubuntu (и других операционных систем, подобных Debian), так и для Android.

@Virtlink Я знаю, что это только профессиональная функция, но похоже, что Unity просто выдаст предупреждение при использовании p / invokes. Я не использую, если Unity исправила это в V4, но V3 позволяет вам использовать их в любом случае. Достаточно и судебного разбирательства.

Еще одно замечание: есть ли конкретная причина, по которой вам НУЖНО использовать dll C ++? Практически во всех случаях вы можете делать все, что хотите, в управляемом коде C #. Будьте абсолютно уверены, что эта DLL вам нужна, так как она нарушит кросс-совместимость с единственной кодовой базой. С моей dll я решил отказаться от своего варианта использования и переписал все это на C #.

person nterry    schedule 17.04.2013