JNI初试
2016-05-18 21:56
435 查看
这几天学习了一下JNI,在此记录一下!
新建android项目JNITest,然后app->new->Folder->JNI Folder在src/main目录下生成jni
修改local.properties,添加ndk目录
修改gradle.properties,添加
build项目,生成class文件,然后执行javah生成头文件
将生成的头文件copy到jni目录,并创建编写.c文件
在cmd中,cd到jni目录,执行ndk-build,会自动生成src/main/libs目录,并在libs中生成so库
将src/main/libs中的so库copy到libs目录下
在build.gradle中添加如下,指明so库的路径
调用的代码如下
准备
下载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中设置ndkdefaultConfig { 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());
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题