2016-03-24 4 views
1

Мне не нужен какой-либо java в моем маленьком приложении NDK. Я хочу загрузить общую .so-библиотеку. Я хочу вызвать LoadLibrary для него непосредственно из C++, используя jni. Кто-нибудь пытался это сделать?как вызвать LoadLibrary для моей .so общей библиотеки из C++

BTW Я уже упаковал библиотеку .so в apk вместе с основным .so-файлом. Также обратите внимание, что я использую Visual Studio 2015 для разработки Android, поэтому нет .mk-файлов

ответ

0

Вам не нужно вызывать loadLibrary (...) из C++ для использования разделяемой библиотеки. Вам просто нужно установить ссылку на него при создании кода на C++.

Посмотрите на native-activity example в NDK examples Google. Если вы хотите использовать новую экспериментальную поддержку NDK, вместо этого вы должны обратиться к these examples.

Обновление: Для пользователей Visual Studio возможно, что это tutorial on creating a native-activity было бы более полезным.

+0

спасибо, это было бы правильной вещью. К сожалению, у меня нет доступа к файлу android.mk, поэтому я не могу использовать этот механизм, потому что я использую Visual Studio 2015 для разработки для Android, и у него есть только куча странных XML-файлов и файлов .mk (поэтому LOCAL_SHARED_LIBRARIES) ... – Yuriv

+0

это просто стандартная нативная активность, которую у меня уже есть. моя проблема: я не могу теперь использовать общую .so-библиотеку из моей родной деятельности. Этот учебник не охватывает этого. – Yuriv

+0

Вам нужно будет узнать, как Visual Studio разрешает зависимости для приложений NDK. Использование loadLibrary (...) - это всего лишь шаг, необходимый для использования этого кода с Java, но в этих странных XML-файлах или какой-либо другой части конфигурации должно быть некоторое разграничение зависимостей. Я не могу помочь вам больше, потому что у меня нет VS, но, возможно, этот пример покажет некоторые ответы: https://code.msdn.microsoft.com/TwoLibs-Android-Library-6396e5c4/view/SourceCode #content Удачи. –

0

мне удалось вызвать LoadLibrary, как это:

*jclass sysClass = (*env)->FindClass(env, "java/lang/System"); 
jmethodID loadLib = (*env)->GetStaticMethodID(env, sysClass, "loadLibrary", "(Ljava/lang/String;)V"); 
jstring jstr1 = (*env)->NewStringUTF(env,"libSharedObject1"); 
(*env)->CallStaticVoidMethod(env, sysClass, loadLib,jstr1);* 

К сожалению, несмотря на то, что успешно работает позже он выходит из строя в несвязанной месте так Iguess мой призыв вызывает некоторое искажение вниз линии. Я также могу вызвать загрузку библиотеки следующим образом:

void * lib_handle = dlopen ("/ data/data/Android1/lib/libSharedObject1.so", RTLD_LAZY);

Этот звонок, к сожалению, не находит мою библиотеку в этом месте. Без пути это тоже не находит, поэтому я все еще застрял.

Смежные вопросы