Android NDK UnsatisfiedLinkError при вызове встроенной функции, находящейся в проекте библиотеки Android - PullRequest
3 голосов
/ 15 декабря 2011

Я создал приложение для Android, которое использовало Android NDK для создания общей нативной библиотеки (.so) для вычисления sha1, и она работала просто отлично, когда была в одном автономном проекте.Недавно, хотя я превратил этот проект в общий проект Android и сохранил там код jni ... Затем я создал новый проект, который ссылается на общий проект, и проект, кажется, работает правильно, за исключением того, что я получаю UnsatisfiedLinkError при вызове встроенной функции.Нативная функция вызывается из Java-класса с именем Hash.Внутри этого класса есть некоторые встроенные функции, которые делают вызовы для вычисления хэша sha1 для файла.

Код ndk / jni компилируется и попадает в APK приложения, однако я продолжаю получать эту ошибку.Я удалил приложение на своем телефоне, выполнил очистку ndk-build, чтобы убедиться, что он не получает старые ссылки. И т.д. и не повезло.Я также убедился, что имена моих функций jni совпадают с

Так вот суть моего кода:

Hash.java

package com.mydomain.sdk.util.Hash

public class Hash {
    static {
      System.loadLibrary("native_sha1")
    }

    public static native String getFileHashNative(String fileName);

}

Тогда у меня (в том же проекте

jni / Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE    := native_sha1
LOCAL_SRC_FILES := sha1.c sha1_native.c
include $(BUILD_SHARED_LIBRARY)

jni / sha1_native.c

jstring Java_com_mydomain_sdk_util_Hash_getFileHashNative(JNIEnv * env, jclass this, jstring fileName)
{
  //call function from sha1.c to get sha1, return to user
}

В любом случае, все это работало замечательно, пока я не изменил структуру своего проекта, чтобы я мог повторно использовать общий код (помещая его в проект библиотеки Android).файл Я могу видеть каталог lib, и в нем есть файл armeabi / libnative_sha1.so. Таким образом, он определенно находится там и просто не работает.

Обновление - Некоторая отладочная информация

Хорошо, поэтому я добавил некоторую отладку .. Я взял loadLibrary из статического блока и поместил его в функцию, которую я вызываю, прежде чем пытаться вызвать Hash.getFileHashNative

12-15 12:34:13.143: D/Hash(31567): Attempting to load native_sha1 lib
12-15 12:34:13.153: D/dalvikvm(31567): Trying to load lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8
12-15 12:34:13.163: D/dalvikvm(31567): Added shared lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8

12-15 12:34:13.163: D/dalvikvm(31567): No JNI_OnLoad found in /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8, skipping init
12-15 12:34:13.163: W/dalvikvm(31567): No implementation found for native Lcom/mydomain/sdk/util/Hash;.getFileHashNative (Ljava/lang/String;)Ljava/lang/String;

I'mне уверен, что это вызывает, но кажется, что он не может найти функцию, очевидно .. Единственное, что яm modifying - это имя mydomain, все остальное точно. Также обратите внимание, что мой библиотечный проект имеет имя пакета com.mydomain.sdk, а мой прикладной проект просто com.mydomain. Исходный код sha1 находится в библиотечном проекте.под com.mydomain.sdk.util.Hash Я не понимаю, что здесь происходит.Есть идеи?

1 Ответ

3 голосов
/ 16 декабря 2011

Хорошо, я не хочу отвечать на другие мои собственные вопросы, но после многих часов борьбы с этим, я думаю, я наконец понял это.В манифесте моего приложения мне нужно было установить

AndroidManifest.xml

 <uses-library android:name="com.mydomain.sdk" android:required="true" />

Это странно, потому что в большинстве документов, которые я читаю онлайн, они не упоминаютиспользуя это, и я подумал, что это просто связано с тем, что рынок использует для разрешения зависимостей между приложениями (в отличие от зависимостей для библиотеки).Также мне кажется странным, что проект компилировался и запускался вообще, по крайней мере, без предупреждения, когда у меня его там не было.

- Обновление - январь 2014 г. -

Это больше не требуется для компиляции и запуска приложения.Если вы используете относительно новые (в течение 1,5 лет) инструменты для сборки Android, вам это вообще не нужно.У меня не было этой проблемы более года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...