2016-04-25 12 views
0

NDKを使用して簡単なプログラムを作成しようとしていますが、同じエラーが何度も繰り返されていますが、スタックオーバーフローからすべてのソリューションを適用しましたが、私のコードは正しくコンパイルされ、ライブラリは正しく読み込まれますが、私のアプリを実行すると "java.lang.UnsatisfiedLinkError"例外がスローされます。ここでは完全なコードです。 plzは私を助けます。あなたの助けはここにNDKでUnsatisfiedLinkErrorが発生しました

をappretiatedされます私のコード

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(); 

} 

ですこれは私のヘッダーファイルです

#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 

これは、これはの.mkファイルです

#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"); 

} 

私のCファイルです

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

、これは

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' 
} 

答えて

1

あなたのbuild.gradleが内蔵されたNDK-構築するために、ここでの呼び出し無効build.gradleです:

jni.srcDirs = [] 

あなたは、ライブラリが実際に構築されていますか? 'jniLibs'または 'libs'ディレクトリの下にHelloJNI.soが表示されない場合は、実際にネイティブコードを作成していません。

あなたはこの単純なプロジェクトにAndroid.mkファイルを必要としませんが、もしあなたがこのルートに行くには、Android.mkとgradleを使ってph0bにgreat tutorialがあります。

// 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 
    } 
} 

あなたは、実験のGradleサポートして行くことを選択した場合、どのように構築するNDK samples文書と:あなたはph0bのチュートリアルからこのスニペットのようなもので、あなたのbuild.gradleからNDK-構築するための呼び出しを追加する必要がありますbuild.gradleでネイティブコードを使用します。 build.gradle file from hello-jniは良い出発点です。

+0

ありがとうございます – Nasir

関連する問題