2016-04-25 16 views
0

Ich versuche, ein einfaches Programm mit NDK zu machen, aber ich bekomme den gleichen Fehler immer wieder Ich habe alle Lösungen aus Stack-Überlauf angewendet, aber immer noch bekomme ich den gleichen Fehler. Obwohl mein Code korrekt kompiliert wird und meine Bibliotheken korrekt geladen werden, gibt es bei der Ausführung meiner App "java.lang.UnsatisfiedLinkError" Exception. Hier ist mein vollständiger Code. bitte hilf mir . Ihre Hilfe wirdjava.lang.UnsatisfiedLinkError in NDK Android Studio

#include <jni.h> 


/* Header for class com_example_nasir_ndk2exmp_MainActivity */ 

#ifndef _Included_com_example_nasir_ndk2exmp_MainActivity 
#define _Included_com_example_nasir_ndk2exmp_MainActivity 
#ifdef __cplusplus 
extern "C" { 
#endif 
#undef com_example_nasir_ndk2exmp_MainActivity_MODE_PRIVATE 
#define com_example_nasir_ndk2exmp_MainActivity_MODE_PRIVATE 0L 
#undef com_example_nasir_ndk2exmp_MainActivity_MODE_WORLD_READABLE 
#define com_example_nasir_ndk2exmp_MainActivity_MODE_WORLD_READABLE 1L 
#undef com_example_nasir_ndk2exmp_MainActivity_MODE_WORLD_WRITEABLE 
#define com_example_nasir_ndk2exmp_MainActivity_MODE_WORLD_WRITEABLE 2L 
#undef com_example_nasir_ndk2exmp_MainActivity_MODE_APPEND 
#define com_example_nasir_ndk2exmp_MainActivity_MODE_APPEND 32768L 
#undef com_example_nasir_ndk2exmp_MainActivity_MODE_MULTI_PROCESS 
#define com_example_nasir_ndk2exmp_MainActivity_MODE_MULTI_PROCESS 4L 
#undef com_example_nasir_ndk2exmp_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 
#define com_example_nasir_ndk2exmp_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_AUTO_CREATE 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_AUTO_CREATE 1L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_DEBUG_UNBIND 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_DEBUG_UNBIND 2L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_NOT_FOREGROUND 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_NOT_FOREGROUND 4L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_ABOVE_CLIENT 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_ABOVE_CLIENT 8L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_WAIVE_PRIORITY 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_WAIVE_PRIORITY 32L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_IMPORTANT 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_IMPORTANT 64L 
#undef com_example_nasir_ndk2exmp_MainActivity_BIND_ADJUST_WITH_ACTIVITY 
#define com_example_nasir_ndk2exmp_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L 
#undef com_example_nasir_ndk2exmp_MainActivity_CONTEXT_INCLUDE_CODE 
#define com_example_nasir_ndk2exmp_MainActivity_CONTEXT_INCLUDE_CODE 1L 
#undef com_example_nasir_ndk2exmp_MainActivity_CONTEXT_IGNORE_SECURITY 
#define com_example_nasir_ndk2exmp_MainActivity_CONTEXT_IGNORE_SECURITY 2L 
#undef com_example_nasir_ndk2exmp_MainActivity_CONTEXT_RESTRICTED 
#define com_example_nasir_ndk2exmp_MainActivity_CONTEXT_RESTRICTED 4L 
#undef com_example_nasir_ndk2exmp_MainActivity_RESULT_CANCELED 
#define com_example_nasir_ndk2exmp_MainActivity_RESULT_CANCELED 0L 
#undef com_example_nasir_ndk2exmp_MainActivity_RESULT_OK 
#define com_example_nasir_ndk2exmp_MainActivity_RESULT_OK -1L 
#undef com_example_nasir_ndk2exmp_MainActivity_RESULT_FIRST_USER 
#define com_example_nasir_ndk2exmp_MainActivity_RESULT_FIRST_USER 1L 
#undef com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_DISABLE 
#define com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_DISABLE 0L 
#undef com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_DIALER 
#define com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_DIALER 1L 
#undef com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_SHORTCUT 
#define com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_SHORTCUT 2L 
#undef com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 
#define com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L 
#undef com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 
#define com_example_nasir_ndk2exmp_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L 
#undef com_example_nasir_ndk2exmp_MainActivity_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS 
#define com_example_nasir_ndk2exmp_MainActivity_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS 65534L 
#undef com_example_nasir_ndk2exmp_MainActivity_HONEYCOMB 
#define com_example_nasir_ndk2exmp_MainActivity_HONEYCOMB 11L 
#undef com_example_nasir_ndk2exmp_MainActivity_MSG_REALLY_STOPPED 
#define com_example_nasir_ndk2exmp_MainActivity_MSG_REALLY_STOPPED 1L 
#undef com_example_nasir_ndk2exmp_MainActivity_MSG_RESUME_PENDING 
#define com_example_nasir_ndk2exmp_MainActivity_MSG_RESUME_PENDING 2L 
/* 
* Class:  com_example_nasir_ndk2exmp_MainActivity 
* Method: helloJNI 
* Signature:()Ljava/lang/String; 
*/ 



JNIEXPORT jstring JNICALL Java_com_example_nasir_ndk2exmp_MainActivity_HelloJNI 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

Dies ist meine C-Datei

#include "com_example_nasir_ndk2exmp_MainActivity.h" 

/* 
* Class:  com_example_nasir_ndk2exmp_MainActivity 
* Method: helloJNI 
* Signature:()Ljava/lang/String; 
*/ 

JNIEXPORT jstring JNICALL Java_com_example_nasir_ndk2exmp_MainActivity_HelloJNI(JNIEnv * env, jobject obj) 
{ 

    return (*env)->NewStringUTF(env, "Hello From JNI"); 

} 

Dies ist .mk Datei

hier ist mein Code

package com.example.nasir.ndk2exmp; 

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Log.e("JNI Message", HelloJNI()); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
    static { 
     System.loadLibrary("HelloJNI"); 
    } 
    public native String HelloJNI(); 

} 

Dies ist meine Header-Datei appretiated werden

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

und das ist build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "com.example.nasir.ndk2exmp" 
     minSdkVersion 19 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 

     ndk{ 
      moduleName "HelloJNI" 
     } 


    } 

    sourceSets.main{ 
     jni.srcDirs = [] 
     jniLibs.srcDir 'src/main/libs' 
    } 


    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.3.0' 
    compile 'com.android.support:design:23.3.0' 
} 

Antwort

1

Ihre build.gradle deaktiviert Aufruf der eingebauten NDK-bauen hier:

jni.srcDirs = [] 

Sind Sie sicher, dass die Bibliothek tatsächlich gebaut wird? Wenn Sie HelloJNI.so nicht im Verzeichnis 'jniLibs' oder 'libs' finden, erstellen Sie keinen systemeigenen Code.

Sie brauchen nicht wirklich die Android.mk Datei für ein Projekt so einfach, aber wenn Sie diese Route gehen möchten, hat ph0b eine great tutorial auf Android.mk mit Gradle verwenden. Sie müßten einen Anruf hinzufügen von Ihrem build.gradle mit so etwas wie dieser Ausschnitt aus ph0b Tutorial NDK-build:

// call regular ndk-build(.cmd) script from app directory 
task ndkBuild(type: Exec) { 
    if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
     commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath 
    } else { 
     commandLine 'ndk-build', '-C', file('src/main').absolutePath 
    } 
} 

Wenn Sie mit der experimentellen gradle Unterstützung wählen zu gehen, die NDK samples Dokument wie zu bauen und Verwenden Sie systemeigenen Code mit build.gradle. Die build.gradle file from hello-jni ist ein guter Anfang.

+0

Vielen Dank für Ihre Antwort – Nasir

Verwandte Themen