JNI папку в Android Studio

Я намагаюся зробити додаток helloy-jni в Android Studio, і я маю виняток

06-27 13:17:19.099  12714-12714/com.example.testjni2           E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.ExceptionInInitializerError
    at java.lang.Class.newInstanceImpl(Native Method)
    at java.lang.Class.newInstance(Class.java:1319)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1071)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
    at android.app.ActivityThread.access$700(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5306)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.UnsatisfiedLinkError: Couldn't load hello-jni from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.testjni2-1.apk,libraryPath=/data/app-lib/com.example.testjni2-1]: findLibrary returned null
    at java.lang.Runtime.loadLibrary(Runtime.java:365)
    at java.lang.System.loadLibrary(System.java:535)
    at com.example.testjni2.MainActivity.(MainActivity.java:9)
    ... 15 more

Мій проект структури виглядає так

TestJni2Project

Я додав свою лінію build.gradle:

   compile files('libs/armeabi/libhello-jni.so')

Але це не допомогло. Я читаю Gradle та Android Gradle плагін , але я не знаходжу інформацію про роботу з jni папкою

Я думаю, що це файлових залежностей , але це не не працюю

Мій файл hello-jni.c включений

jstring  Java_com_example_testjni2_MainActivity_stringFromJNI (JNIEnv *env, jobject thiz){
    return (*env)->NewStringUTF(env, "Hello from JNI !");
  }

Мій файл MainActivity включає в себе

public class MainActivity extends Activity {
    static {
        System.loadLibrary("hello-jni");
    }
    public native String  stringFromJNI();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String text = stringFromJNI();
        Log.i("MainActivity", text);
    }

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

}

Мій файл Android.mk містить

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Скажи, будь ласка, де я можу помилитися.

Android Studio 0.1.7 ОС - Windows 7 x64

16
збудували за допомогою інструментів NDK
додано Автор Poovizhirajan N, джерело
його достатньо для додавання lib
додано Автор Poovizhirajan N, джерело
Я створив. Та бібліотеку використовував Cygwin Terminal та NDK command/cygdrive/c/Користувачі /% USER_NAME%/android-ndk/android-ndk-r8e/nd & kwn; k-build чи цього недостатньо?
додано Автор AndreyNik, джерело

7 Відповіді

На сьогоднішній день існує більш простий спосіб, ніж прийнята відповідь.

Все, що вам потрібно зробити, це створити папку під назвою "jniLibs" у каталозі /src/main (тобто/app/src/main/jniLibs) і помістіть свій. тому файли там. Це виглядатиме так:

app
   |
   src
      |
     main
        |
        jniLibs
            |
            armeabi
            |   |
            |   your_lib_compiled_for_armeabi.so
            |
            armeabi-v7a
            |   |
            |   your_lib_compiled_for_v7a.so
            |
            x86
            |   |
            |   your_lib_compiled_for_x86.so

Ваші .so файли слід підібрати зараз.

64
додано
@Mussa - якби ви зберегли дні - так архові диски повинні йти під app/src/main/jniLibs - kudos!
додано Автор Moonwalker, джерело
Я отримую цю помилку "java.lang.UnsatisfiedLinkError: Невірна версія JNI повернута з JNI_OnLoad в" /mypath/libfile.so ": -4", я не можу показати справжнє ім'я файлу тут !!
додано Автор r4jiv007, джерело
Що ми робимо для x64?
додано Автор Almo, джерело
просто додавши .so файли всієї архітектури pross, не додаючи жодної конфігурації в градієнтний файл?
додано Автор Fakher, джерело
Можливо, вам доведеться змінити вашу відповідь, сказавши Mussa . Мій тест працює на Android Studio 1.5.
додано Автор nn0p, джерело
Так, це не працює для мене. Я використовую останню стабільну градле та Android Studio.
додано Автор r1k0, джерело
Це чудово, ти робиш свій день.
додано Автор Sandeep Londhe, джерело
Це має бути app/src/main/jniLibs
додано Автор Mussa, джерело

Існує інший спосіб імпортувати таким чином андроїдний проект.

  1. create the lib dir and armeabi dir like this, and copy so to it.
    |-project
    |--lib
    |----armeabi
    |------libhello-jni.so
  2. zip the dir lib.
  3. put the zip to the libs dir of project, and change .zip to .jar.
  4. add code to the dependencies part of build.gradle.
    compile fileTree(dir:'libs', include:'lib.jar')
15
додано
Так, спасибі, це рішення чудово працює
додано Автор AndreyNik, джерело

Ви можете додавати попередньо зібрані файли * .so в Android Studio, використовуючи gradle 0.7.2+. Спочатку створіть jniLibs в цьому розташуванні/app/src/main/location і скопіюйте всю папку з файлами * .so (armeabi, armeabi-v7a, mips, x86) у jniLibs.

As Xavier said same here https://groups.google.com/forum/#!msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ

11
додано

Додайте це до вашого build.gradle:

sourceSets {
    main {
        jniLibs.srcDir 'jniLibs'
    }
}

під ним:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
10
додано
Де є документ про jniLibs ?
додано Автор nn0p, джерело
Спасибі, це працює для мене
додано Автор Amit Bhati, джерело

Система gradle build не підтримує зв'язування нативних бібліотек на даний момент. Перевірте https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J для деяких спеціальних завдань, які потрібно додати до вашого build.gradle.

Зауважте, що це тимчасовий шлях до того, як gradle підтримує побудову вітчизняних проектів.

7
додано
Gradle тепер підтримує це спочатку. Див мою відповідь нижче.
додано Автор Tiago, джерело

There is a new way to work with *.so files on gradle 0.7.3 Please check out this link How to change libs directory in Gradle?

1
додано

Для тих, хто не хоче вручну створювати каталог jniLibs , ось офіційний документ про те, де розміщені рідні бібліотеки.

Офіційним документом є Довідник DSL для Android плагіна . Перегляньте версію плагіна gradled forroid, яку можна знайти в Android Studio.

sourceSets stores the information for resources to compile the app.

jniLibs of sourceSets is for JNI libs.

0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.