Android C++ и Java

Сегодня у нас есть прекрасная возможность программировать (это значит ещё и отлаживать) на C++ под Android не используя убогий ndk-build или прекрасный, но дорогущий VisualGDB. Возможность эту нам подарила компания nVidia, которая выпустила отличный пакет утилит AndroidWorks. Главное в его составе — это плагин Tegra Nsight для Visual Studio, который отлично зарекомендовал себя в реальных приложениях. По-хорошему, надо бы мне начать сначала, т.е. с установки и минимального приложения, но вчера я столкнулся с одной вещью, которую необходимо срочно записать.

Дело в том, что в Android два пути загрузки .so библиотек, это System.loadLibrary и класс NativeActivity, который использует функцию loadNativeCode. И если вам не надо комбинировать C++ с Java, то можно спокойно использовать (даже не зная об этом) NativeActivity и не париться. Но т.к. мы хотим, например, подключить Facebook SDK и часть его использовать прямо из C/C++, то мы столкнёмся с тем, что:

a) JNI функция FindClass понятия не имеет о классе com/facebook/FacebookSdk (и любом другом из пакета), при этом в Java всё нормально работает.

b) Передать экземпляр класса в C не представляется возможным — срабатывает исключенине java.lang.UnsatisfiedLinkError: Native method not found.

Я не вдавался в подробности работы loadNativeCode, но виноват в этом именно он. Поэтому надо постараться использовать System.loadLibrary до вызова loadNativeCode. Пока что, я решил это тем, что пишется (это на Java) свой дочерний класс от NativeActivity, и библиотека заружается до вызова родительского onCreate. В котором всё равно вызовется loadNativeCode — нам ведь надо, чтобы работал наш C код, совместимый с NativeActivty. Потом, возможно, придумаю что-нибудь симпатичнее.

Далее мы столкнёмся с тем, что FindClass по-прежнему ничего не знает о FacebookSdk, хотя native методы заработали. Об этом потом.