Прежде всего, есть очень веские причины использовать последнюю версию NDK. На момент написания этой статьи r20, к счастью, поддерживает только два варианта STL: c ++ _ shared и c ++ _ static .
Самый простой способ организовать ваши нативные библиотеки - собрать их все с помощью c ++ _ shared .
Я понимаю, что вы столкнулись с некоторыми проблемами при таком подходе. Исправление этих проблем может быть полезно в долгосрочной перспективе, потому что эти проблемы могут быть признаками некоторых внутренних проблем в вашем коде.
Но если вы не можете, не отчаивайтесь.
Ваше приложение может безопасно использовать различные библиотеки mative, каждая из которых построена на своем собственном STL, если оно не смешивает эти нативные библиотеки. Если у вас есть класс Java A , который имеет собственные методы в libA.so и класс B со своим собственным libB.so , и там нет вызовов от libA.so до libB.so или наоборот, вам не важно, какой STL используется libA.so , а какой - libB.so .
Кроме того, если у вас есть собственная библиотека libQ.so, которая вызывает функции C в libP.so, вам все равно, будет ли libP или libQ вообще использовать STL, или какой STL использует каждый из них. Но это верно, если эти функции C не являются скрытыми функциями C ++. Они не должны передавать объекты C ++ (включая std :: string ). Они не должны получать или возвращать указатели на объекты C ++ (даже если C API использует reinterpret_cast для void *.
Обратите внимание, что для большинства практических целей правила для библиотек, построенных с c ++ _ static , одинаковы. Две такие библиотеки не должны передавать объекты C ++ от одного к другому.