Использовать Apache HTTP для SDK уровня 23:
Top level build.gradle - /build.gradle
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// Lowest version for useLibrary is 1.3.0
// Android Studio will notify you about the latest stable version
// See all versions: http://jcenter.bintray.com/com/android/tools/build/gradle/
}
...
}
Уведомление от студии Android о обновлении градиента:
Тип модуля build.gradle - /app/build.gradle
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
...
useLibrary 'org.apache.http.legacy'
...
}
channel.setCallback(channelCallback);
Это проблема. FMod - неуправляемый код. Здесь вы создаете объект-делегат и передаете его неуправляемому коду. Проблема в том, что сборщик мусора не может отслеживать ссылки, хранящиеся в собственном коде. Следующая мусорная коллекция найдет no ссылки на объект и соберет его. Kaboom, когда нативный код выполняет обратный вызов.
Вам нужно сохранить ссылку самостоятельно, чтобы этого не произошло:
public class Music
{
private SomeDelegateType callback
//...
public Music(string file)
{
File = file;
callback = new SomeDelegateType(channelCallback);
}
public virtual void Play()
{
Audio.System.playSound(channel == null ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE, music, false, ref channel);
music.addSyncPoint(500, TIMEUNIT.MS, "wooo", ref syncPtr);
channel.setCallback(callback);
}
Вам нужно найти фактический тип делегата из Код обертки FMod, я просто догадывался о «SomeDelegateType».
У меня была аналогичная проблема между VB.NET и пользовательской C ++ DLL. Исправлено благодаря @Hans. Я много раз обязан этому сайту для всех проблем, с которыми мне пришлось пройти. Добавляем решение проблемы + в надежде, что он помогает другим видеть одно и то же решение в другом контексте.
Объявил это (в модуле)
Public Delegate Sub CB_FUNC(ByVal x As Integer, ByVal y As Integer)
Public Declare Sub vidProc_cb_MouseClick Lib "C:\Users\.....\vidProc\product\vidProc.dll" (ByVal addr_update As CB_FUNC)
Имел простой вызов в кнопке button_click:
vidProc_cb_MouseClick(AddressOf updateXY)
Я бы получил ошибку «CallbackOnCollectedDelegate». Не сразу, но после взаимодействия с другими объектами в форме, а затем пытается вызвать обратный вызов (который в моем случае был щелчком мыши в окне OpenCV).
1) Объявление (в классе формы, декларации)
Private addr_update As CB_FUNC
2) Определение addr_update для формы Load
addr_update = New CB_FUNC(AddressOf updateXY)
3) Вызов функции «set callback» с помощью функции новый указатель (в кнопке button_click)
vidProc_cb_MouseClick(addr_update)
Я думаю, что понял @Hans и внедрил его правильно (я не могу воспроизвести ошибку). Надеюсь, это кому-то поможет.
channel.setCallback(channelCallback);
преобразуется компилятором вchannel.setCallback(new SomeDelegateType(channelCallback));
. – Bevan 4 September 2011 в 22:45