您的位置:首页 > 移动开发 > Android开发

JNI初试

2016-05-18 21:56 435 查看
这几天学习了一下JNI,在此记录一下!

准备

下载NDK并配置环境变量

新建android项目JNITest,然后app->new->Folder->JNI Folder在src/main目录下生成jni



修改local.properties,添加ndk目录
ndk.dir=D:\\Android\\ndk


修改gradle.properties,添加
android.useDeprecatedNdk=true


生成c文件

创建Hello.java类,然后创建native方法
public native String hello();


build项目,生成class文件,然后执行javah生成头文件



将生成的头文件copy到jni目录,并创建编写.c文件

#include "demo_cxs_com_ndktest_Hello.h"

JNIEXPORT jstring JNICALL Java_demo_cxs_com_ndktest_Hello_hello(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"hello world");
}


编译生成动态库有两种方式,如下:

方式一:这种方式只需配置gradle,不用Android.mk和Application.mk,这样编译项目时会自动把jni目录下的所有文件编译生成jnihello.so库,生成的so库是在build下面,可通过查找.so查看

在build.gradle中设置ndk

defaultConfig {
applicationId "demo.cxs.com.ndktest"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"

ndk{
moudleName "jnihello"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}


方式二:需要手动执行ndk-build命令生成.so,这种方式可以在需要生成多个so库时执行多次来完成,而且生成的库目录比较明确,容易找到

在jni目录下添加Android.mk(指明编译依赖和步骤)和Application.mk(指明适配的架构类型)

在cmd中,cd到jni目录,执行ndk-build,会自动生成src/main/libs目录,并在libs中生成so库



将src/main/libs中的so库copy到libs目录下

在build.gradle中添加如下,指明so库的路径

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}


调用

需在Hello.java文件中加载库,切记库名要和上面的moudleName一致

static {
System.loadLibrary("jnihello");
}


调用的代码如下

TextView tv = (TextView)findViewById(R.id.tv_hello);
Hello hello = new Hello();
tv.setText(hello.hello());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ndk jni