Jak vyřešit java.lang.UnsatisfiedLinkError v NDK v Androidu?

hlasů
24

Jsem nový ve vývoji NDK v android.I prošly souborového systému NDK android. Zde se vysvětluje, co jsem udělal. 1) Vytvořil jsem složku s názvem „JNI“ vytvořit soubor s názvem 2 Android.mk a ndkfoo.c.

v Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE    := ndkfoo
LOCAL_SRC_FILES := ndkfoo.c

include $(BUILD_SHARED_LIBRARY)

a ndkfoo.c

#include <string.h>
#include <jni.h>

jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
 return (*env)->NewStringUTF(env, Hello from native code!);
}

Pak jsem vytvořil třída NdkFooActivity, ve které jsem napsal

// load the library - name matches jni/Android.mk
 static {
  System.loadLibrary(ndkfoo);
 }

Ale teď, když jsem stavět z Cygwin v xp vytváří .so úspěšně soubor pak jsem běžet jako aplikace pro Android. To mi dává java.lang.UnsatisfiedLinkError v Logcat.

Takže, prosím, dejte mi vědět, kde se mýlím.

Díky předem,

Položena 16/07/2010 v 07:32
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
22

Myslím, že jste zapomněli změnit název balíčku.

Java_com_mindtherobot_samples_ndkfoo

Mělo by to být váš balíček, co jste zadali vytváření projektu.

Odpovězeno 09/03/2011 v 09:33
zdroj uživatelem

hlasů
20

Také (právě narazil na tomto čísle), upozorňujeme, že System.loadLibrary () bude vždy vyvolá výjimku, pokud jsou testování na emulátoru Intel Atom x86. To funguje v pohodě na pravidelných Android emulátorů a ladění na fyzické zařízení.

Odpovězeno 14/12/2012 v 00:47
zdroj uživatelem

hlasů
11

Ačkoli toto nebylo OP je problém, měl jsem stejný java.lang.UnsatisfiedLinkError z důvodu chybějící

static {
    System.loadLibrary("mylibraryname");
}
Odpovězeno 20/01/2012 v 07:53
zdroj uživatelem

hlasů
5

Je tu dobrá šance, že podpis je v pořádku, jak již bylo zmíněno jiní.

Pokud spustíte nástroj javah, můžete najít přesné podpis. Ze složky bin v projektu, kde APK je i kořen třídy hierarchie Java je generován, běh:

javah -o jni_sig.h com.mindtherobot.whatever.your.package.is.NdkFooActivity

... a pokud máte název název balíčku a třída správný, bude vypsat záhlaví (s názvem jni_sig.h) s podpisem správná funkce (y) pro všechny nativní funkce. Kopírovat, že se záhlaví a .c souboru, přidání parametry podle potřeby, a to by mělo fungovat správně.

Odpovězeno 25/09/2010 v 07:23
zdroj uživatelem

hlasů
4

Možná, že už nemá význam, ale pokud vím, je také nutné přidat „lib“ prefix do svého rodného jména knihovny. Ve vašem případě je nutné změnit Android.mk na „LOCAL_MODULE: = libndkfoo“ a udržet „System.loadLibrary (“ ndkfoo „);“ jak to je. Zkontrolujte NDK ukázkový kód.

Odpovězeno 11/12/2012 v 21:41
zdroj uživatelem

hlasů
3

Jsem si jistý, že by mělo být:

JNIEXPORT jstring JNICALL Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
 return (*env)->NewStringUTF(env, "Hello from native code!");
}

Které SDK se zaměřujete, a jakou verzi NDK máte? Má chyba, že jste stále říkají, že nemůže načíst knihovnu vůbec nebo že došlo k unimplemented metoda? Ať tak či onak ujistit, že nemáte android: hasCode = „false“ nastavena na značku přihlášky ve svém manifestu.

Můžete také otevřít soubor APK po sestavení pomocí WinRAR nebo něco podobného, ​​aby se ujistil, že soubor libndkfoo.so je skutečně součástí balíčku.

Ať tak či onak, pokud si nejste deklarování nativní funkce v NdkFooActivity dostanete tuto chybu, tj

public static nativní String invokeNativeFunction ();

Odpovězeno 13/01/2012 v 15:39
zdroj uživatelem

hlasů
2
JNIEXPORT jstring JNICALL Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
 return (*env)->NewStringUTF(env, "Hello from native code!");
}

Problém je, že při kompilaci pro cílový procesor a provádět v jiných. pokud při kompilaci v ARM (armeabi), pak spustit v emulátoru na bázi armeabi. vytvořit soubor nazvaný application.mk ve stejné složce jako Android.mk a dát uvnitř jedné z toho:

  1. APP_ABI: = x 86
  2. APP_ABI: = armeabi
  3. APP_ABI: = MIPS
  4. APP_ABI: = armeabi x86 mips // sestavit ve všech cílových a dostanete 3 * .so soubory

pak kompilace,> spustit. by to mělo fungovat.

Odpovězeno 11/08/2013 v 22:03
zdroj uživatelem

hlasů
1

Název metody Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction

nemusí být stejný jako vaše jméno balíčku nebo název třídy. Aby se toto pojmenování metody stejný, je nutné použít javah.

To umožní, aby hlavičkový soubor, který bude mající stejný název metody, která je required.To aby tento soubor záhlaví přejděte do složky tříd do koše svého projektu (ujistěte se, že jste vytvořili java soubor statické metody a postavit ji správně ) tímto příkazem v terminálu

~/workspace/Android_Example2/bin/classes$

V tomto adresáři napsat následující příkaz

sudo javah -jni com.NDK.android_example2.MainActivity

Změna názvu balíčku a název třídy dle vašich project.This se vytvoří com_NDK_android_example2_MainActivity.h ve složce tříd.

Jednoduše přesunout tento soubor do jnisložky. V tomto souboru, bude statické metody, které jste vytvořili v souboru MainActivity.java ale oni jsou prostě prohlášeny za neprovedl, že budete provádět ve svém Csouboru.

Poznámka: I když se vyrovnat šek metodu, že parametry metody jsou třeba deklarovat, tak aby byly vyhlásit ve svém Csouboru.

Doufat, že to pomůže.

Odpovězeno 11/06/2013 v 06:58
zdroj uživatelem

hlasů
1

Vytvořte soubor Application.mk v JNI folder.Copy následující řádek a vložit ji do Application.mk a save.Now vytváření projektu s cgywin a znovu spustit

APP_ABI: = armeabi armeabi-v7a

Odpovězeno 25/11/2012 v 09:41
zdroj uživatelem

hlasů
0

nahradit toto

Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction

S

Java_your_packege_name_your_Activity_Name_invokeNativeFunction

Například, pokud váš balíček je com.pack a Jméno aktivita je MainActivity poté

Java_com_pack1_MainActivity_invokeNativeFunction 

Nezapomeňte přidat odkaz na aktivity.

// načtení knihovny - název odpovídá JNI / Android.mk

static {
        System.loadLibrary("ndkfoo");
      }

 public native String invokeNativeFunction();

Opakujte všechny tyto kroky by to mělo fungovat :)

Odpovězeno 28/07/2013 v 11:01
zdroj uživatelem

hlasů
0

Zde je návod, jak používat nativní kód: zde

ujistěte se, že nemáte žádné mezery v cestě projektů. Také nemůžete používat podtržítko v balíčku nebo název projektu.

Odpovězeno 29/03/2013 v 16:22
zdroj uživatelem

hlasů
0

Také jsem měl java.lang.UnsatisfiedLinkErrorchybu. Ověřeno jsem všechno zmínit nad odpovědí, ale ještě stále došlo k chybě. Nakonec jsem zjistil, že názvy metod JNI nemůže mít podtržítko.

Příklad: Java_com_example_app_NativeLib_print_out_stuff <- generuje java.lang.UnsatisfiedLinkError: print_out_stuff

Přejmenujte print_out_stuff funkci k něčemu bez podtržítkem: Java_com_example_app_NativeLib_printOutStuff <- díla

Odpovězeno 29/03/2013 v 05:07
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more