UnsatisfiedLinkError pour la fonction native cpp dans l’application Android (ndk)

J’essaie d’exécuter une application facile de ndk Android dans cpp, mais j’obtiens une erreur non satisfaite pour la fonction Generate ()

Toute aide serait appréciée. Je parle assez bien le c ++, mais mon java est un peu rouillé. J’ai essayé beaucoup de conseils du Web concernant les noms, mais jusqu’à présent, pas de chance. Voici mes fichiers:

native.cpp:

#include  #include  jssortingng Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, jobject thiz){ return env->NewSsortingngUTF("Hello from JNI !"); } 

Android.mk:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := native LOCAL_SRC_FILES := native.cpp include $(BUILD_SHARED_LIBRARY) 

Je comstack cela avec ndk-build et tout se passe bien, il me fournit un fichier libnative.so situé dans le répertoire du projet. J’utilise eclipse pour le rest.

OptimuseAppActivity.java:

 package com.optimuse.app; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class OptimuseAppActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText( generate() ); setContentView(tv); } public native Ssortingng generate(); static { System.loadLibrary("native"); } } 

Et le fichier AndroidManifest.xml généré automatiquement

             

Merci pour vos suggestions, je cherche depuis quelques heures!

Vous rencontrez généralement des difficultés avec le nom C ++. Par exemple, voici ce que objdump -T sur la bibliothèque donne lorsque je construis hello-jni.c:

 00000c28 g DF .text 0000002c Java_com_example_hellojni_HelloJni_ssortingngFromJNI 

Et voici ce que je reçois si je traduis en C ++ comme vous l’avez fait:

 00000c94 g DF .text 00000024 _Z48Java_com_example_hellojni_HelloJni_ssortingngFromJNIP7_JNIEnvP8_jobject 

Pour éviter les mutilations et les rendre visibles au format jni, déclarez vos fonctions natives dans un bloc externe “C” {}, c’est-à-dire

 #include  #include  extern "C" { jssortingng Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, jobject thiz); } jssortingng Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, jobject thiz){ return env->NewSsortingngUTF("Hello from JNI !"); } 

Vous avez probablement essayé cela, mais de toute façon, cela ressemblait beaucoup à votre question et j’ai pensé que cela pourrait aider:

Comment résoudre le problème java.lang.UnsatisfiedLinkError dans NDK sous Android?

android ndk UnsatisfiedLinkError lors de l’utilisation d’une bibliothèque partagée prédéfinie

Excellent! Cela fonctionne comme ceci:

 extern "C" { JNIEXPORT jssortingng JNICALL Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, jobject thiz) { return env->NewSsortingngUTF("Hello from JNI cpp!"); //return (*env)->NewSsortingngUTF(env, "Hello from JNI cpp!"); } }