JNI folder in Android Studio
I am trying make helloy-jni app in Android Studio and I have exception
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.<clinit>(MainActivity.java:9)
... 15 more
My structure project looks like this
I added my build.gradle line:
compile files('libs/armeabi/libhello-jni.so')
But this don't helped. I read Gradle and Android Gradle plugin, but I don't find information about working with jni folder
I am thinking what it file dependencies, but it isn't working
My hello-jni.c file includ
jstring Java_com_example_testjni2_MainActivity_stringFromJNI (JNIEnv *env, jobject thiz){
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
My MainActivity file include
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;
}
}
My Android.mk file containts
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Tell me, please, where I could make a mistake.
Android Studio 0.1.7 OS - Windows 7 x64
Nowadays there is an easier method than the accepted answer.
All you have to do is create a folder called "jniLibs" under your /src/main directory (ie, /app/src/main/jniLibs) and place your .so files there. It will look like this:
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
Your .so files should be picked up now.
There is other way to import so to the android project.
- create the lib dir and armeabi dir like this, and copy so to it.
|-project
|--lib
|----armeabi
|------libhello-jni.so - zip the dir lib.
- put the zip to the libs dir of project, and change .zip to .jar.
- add code to the dependencies part of build.gradle.
compile fileTree(dir:'libs', include:'lib.jar')
add this to your build.gradle:
sourceSets {
main {
jniLibs.srcDir 'jniLibs'
}
}
underneath:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}