首页 > 代码库 > 第一个Android studio JNI程序
第一个Android studio JNI程序
现在网上有很多实用JNI的教程,本文主要用于记录自己实现的方法和遇到的坑。
第一步,下载NDK.
NDK可以去谷歌Android developer上下载。国内也有些中国版网站可以下载。
第二步,编写java类,这个类是java和c/c++交互的中介,定义一些native的方法,具体实现由c/c++完成。
package com.example.jni; /** * Created by alexjie on 2017/5/14. */ public class JNIDemo { static { System.loadLibrary("newclient"); } public static native String sayHello(); }
上部代码分两块,静态代码块用于加载我们后续要生成的c/c++实现的.so库,第二部分为定义的一个native的本地方法,此方法将由C++实现。
第三步,生成.h头文件
使用Android Studio的终端Terminal。
进入到main目录下 F:\Andriod\workspaceAS\Demo\newclient\src\main> ,使用命令生成.h头文件 javah -d jni -classpath ./java com.example.jni.JNIDemo
-d jni 头文件生成到jni文件夹(当前在<Project>\app\src\main目录下,所以.h所在的目录为<Project>\app\src\main\jni )
-classpath ./java 指定去当前路径下java下寻找包名指定的类
然后就会在main文件夹下生成jni文件夹和com_example_jni_JNIDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_jni_JNIDemo */ #ifndef _Included_com_example_jni_JNIDemo #define _Included_com_example_jni_JNIDemo #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_jni_JNIDemo * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
第四步,实现main.cpp
.h头文件生成了,现在要实现C++的具体实现,新建一个C++文件:
然后会生成一个main.cpp文件,将.h文件的内容拷入到main.cpp文件,并做具体实现:
// // Created by alexjie on 2017/5/14. // /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_jni_JNIDemo */ #ifndef _Included_com_example_jni_JNIDemo #define _Included_com_example_jni_JNIDemo #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_jni_JNIDemo * Method: sayHello * Signature: ()V */ JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello(JNIEnv *env, jobject jobj){ //返回一句话 return env->NewStringUTF((char *)"JNI hahahahahahahaha"); }; #ifdef __cplusplus } #endif #endif
第五步,配置NDK
打开Project的local.properties文件添加NDK路径
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk { moduleName "newclient" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
第六步,生成.so库
rebuilt项目,在如下目录会生成.so库:app\build\intermediates\ndk\debug\lib
在main文件夹下,新建一个jnilib文件夹,将.so库考到其中。
现在在程序中就可以调用JNIDemo.sayHello()方法了。
问题:
1.build apk时,报错:installation failed with message failed to establish session
解决:关闭MIUI开发者选项中的MIUI优化并重启!
第一个Android studio JNI程序