Я создал приложение для 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 Я не понимаю, что здесь происходит.Есть идеи?