Android NDK C ++ JNI (žádná implementace nalezeno pro nativní ...)

hlasů
61

Snažím se používat NDK v C ++ a nedokážu se dostat způsob pojmenování správné. můj rodný metoda je následující:

extern C {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
   //
}
}

hlavičkou zabalené v externí „C“ {} aslo.

Všechno, kompiluje v pořádku, vytvoří .so soubor a zkopíruje do složky libs v mém projektu, ale když jsem ladit a spouštět v Eclipse Dostávám se log kočičí zprávu o „Nebyl nalezen pro nativní provádění ...“. Je tu něco, co mi chybí, protože všechny příklady NDK se v jazyce C?

Dík.

Položena 04/02/2010 v 07:52
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
98

Existuje několik věcí, které mohou vést k „Nebyla nalezena žádná implementace“. Jedním z nich je dostat název funkce prototyp špatně, další se nedaří načíst .so vůbec. Jsi si jistý, že System.loadLibrary()je volána dříve, než je použita metoda?

Pokud jste nemáte JNI_OnLoadfunkce definovaná, můžete si vytvořit a mít ji vyplivnout zprávu záznamu jen ověřit, že lib je vtažení úspěšně.

Už jste se vyhnul nejčastější problém - zapomněl použít extern "C"- takže je to buď nad, nebo nějaký mírný překlep. Co je prohlášení Java vypadat?

Odpovězeno 19/03/2010 v 22:03
zdroj uživatelem

hlasů
14

Dodatečnou příčinou této chyby: Váš undecorated nativní název metody nesmí obsahovat podtržítko!

Například jsem chtěl vyvážet funkci C s názvem AudioCapture_Ping(). Tady je můj vývozní prohlášení ve složce C:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object);  //Notice the underscore before Ping

Tady byla moje třída Java importu funkce:

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapture_Ping();  // FAILS
    ...

Nemohl jsem se dostat Android dynamicky propojit své rodné způsobem, dokud jsem odstranil podtržení:

JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); 

package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapturePing();  // THIS WORKS!
    ...
Odpovězeno 07/02/2014 v 20:51
zdroj uživatelem

hlasů
13

Měl jsem stejný problém, ale pro mě byla chyba v souboru Android.mk. Měl jsem to:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp 

ale měly by mít toto:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp 

Všimněte detail + = místo : =

Doufám, že to pomůže.

Odpovězeno 17/05/2013 v 00:40
zdroj uživatelem

hlasů
3

Dalším důvodem: Používejte LOCAL_WHOLE_STATIC_LIBRARIES namísto LOCAL_STATIC_LIBRARIES v android.mk. To zastaví knihovnu z optimalizace z nevyužitých volání API, protože NDK nemůže rozpoznat používání nativních vazeb z java kódu.

Odpovězeno 01/10/2013 v 19:35
zdroj uživatelem

Odpovězeno 05/02/2010 v 02:49
zdroj uživatelem

hlasů
2

Volané externí „C“, jak je stanoveno v automaticky generované Studio například, ale zapomněl zabalit celý zbytek souboru, včetně následujících funkcí, v závorkách {}. Pouze první funkce pracovala.

Odpovězeno 13/07/2017 v 22:44
zdroj uživatelem

hlasů
1

Použijte javah (součást Java SDK). Jeho nástroj právě pro toto (generuje .h hlavičku z .class souboru).

Odpovězeno 03/08/2011 v 14:07
zdroj uživatelem

hlasů
0

I čelí stejnému problému dvakrát. Stalo se to, že telefon jsem se pokusil spustit aplikace z Android Studio použili úrovně API , které jsem dosud stáhli v Android Studio.

  1. Aktualizovat Android Studio na nejnovější verzi
  2. Stáhne potřebné API zevnitř Android Studio
Odpovězeno 29/08/2018 v 08:59
zdroj uživatelem

hlasů
0

Pokud je název balíček obsahuje znak _, měli byste napsat 1 (jeden) po _ znak, jak je uvedeno níže:

MainActivity.java

package com.example.testcpp_2;

nativním lib.cpp

JNICALL
Java_com_example_testcpp_12_MainActivity_stringFromJNI(
Odpovězeno 09/03/2018 v 06:55
zdroj uživatelem

hlasů
0

I tváří v tvář stejný problém, a v mém případě, že důvodem bylo, že jsem měl podtrhnout ve jménu balíku „RFID_Test“ přejmenoval jsem balíček a fungovalo to. Díky user1222021

Odpovězeno 19/10/2017 v 17:51
zdroj uživatelem

hlasů
0

Snažím se všechny výše uvedené řešení, ale nikdo nemůže vyřešit můj sestavení chyby (JNI java.lang.UnsatisfiedLinkError: found ... No implementace), nakonec jsem zjistil, že jsem zapomněl přidat svůj verify.cpp zdrojový soubor CMakeList.txt add_library segement (verify.cpp je automaticky vygenerovat pomocí Ctrl + Enter krátký klíč, možná jiný název souboru), doufám, že moje odpověď může pomoci někoho.

moje sestavení prostředí: Gradle + CMake

Odpovězeno 15/08/2017 v 12:30
zdroj uživatelem

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