NDK工具开发Jni,Android studio jni开发
2016-04-18 18:24
573 查看
NDK工具开发JNI
对于JNI的作用,我这边就不详细说明了,百度google 有很多这样的介绍,这边着重详解AS使用NDK工具开发,调C的流程.1,创建工程
2,创建native方法
//该类的路径在main目录任意包下即可
public class JniUtils {
public static native String getStringFromC();
}
[/code]
3, 配置ndk的路径,如果没有自行到 http://www.androiddevtools.cn/ 下载,或者FQ同步下,自动下载.
4,在app项目下gradle的 defaultConfig{ }内添加
ndk {
//生成的so名字
moduleName "JniDemo"
}
[/code]
5,项目的根目录下找到 gradle.properties 添加语句
android.useDeprecatedNdk=true
[/code]
6,到指定class包的根目录下,使用jni编译h 文件.
//注意这里是包的根目录,而不是class文件的子目录
cd class文件路径/intermediates/classes/debug
[/code]
编译h 文件:
//紧接着上一步terminal 编译 h文件
javah -jni com.relicemxd.jnidemo.ndk.JniUtils
//你也可以指定编译的h 文件到指定目录
javah -d /这里是app项目的路径/JniDemo/app/src/main/jni -jni com.relicemxd.jnidemo.ndk.JniUtils
[/code]
7,复制刚生成的 .h文件到 mian/jni 下
下面是.c文件的代码实现:
#include "com_relicemxd_jnidemo_ndk_JniUtils.h"
//这里是C代码的实现
JNIEXPORT jstring JNICALL Java_com_relicemxd_jnidemo_ndk_JniUtils_getStringFromC
(JNIEnv *env, jclass cls) {
return (*env)->NewStringUTF(env, "这是来自C的string !");
}
[/code]
8,在activity代码中加动态库
static{
System.loadLibrary("JniDemo");//.so文件名,注意这里的名字要与gradle的命名一致
}
9,调用native方法
activity调用 native 就可以获取c的输出了.
10,运行结果
欢迎star, 有问题可以issue.
demo : https://github.com/relice/JniDemo
注意问题:
错误1:未指定类.
原因:
javah 命令执行条件是,包的路径与终端执行的路径一致(不可在子路径下执行)
解决:
cd 进入的路径要在class包下的根目录
错误2: java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String
原因:
javah生成的头文件与 main目录下的头文件不一致.
解决:
step1.则要重新clean project ->build project ,否则项目会有缓存,编译照样报错的.
step2.javah -d 指定scr/mian目录下生成头文件 -jni 包名+类名
相关文章推荐
- Android N 特性 ART
- Android图片压缩终极解决方案,是的,终极,终极,终极
- Android平滑图片加载和缓存库 Glide 使用详解
- 六款值得推荐的android(安卓)开源框架简介
- Android PackageManager
- ANDROID自定义视图——onMeasure流程,MeasureSpec详解
- Design Support Library
- android 控件 fragment 简单分析
- android手机的分区相关
- Android打包与混淆相关的一些小知识
- Android_Handler实现异步回调加载数据
- Android WebView Java和JS通信
- AIDL(AndroidInterfaceDefinitionLanguage:接口定义语言)
- android viewGroup事件分发一
- Android MVC模式
- 关于 Android 进程保活,你所需要知道的一切
- Android Inline hook跳转部分代码
- 音乐播放器源码
- Android 注解的简单使用之省去findViewById()
- 【转】android Looper 理解