Android stduio NDK开发
2015-08-21 15:04
309 查看
前言
本文的目标是在Android studio中进行NDK的开发。示例是在main activity中显示一个字符串,而字符串的内容是来自于一个C函数。归结于一句话:NDK是为了让上层的java应用能够调用底层的c/c++而设计的。马上进入主题。
创建一个名为jniDemo的blank activity工程,activity名为MyActivity,在MyActivity类的最后声明一个方法,这个方法会在C函数中去实现,如下图所示,
设置ndk路径,打开local.properties,增加
点击android studio左下角的Terminal
参数意义:
这条命令执行完毕后,会在src/main下生成jni目录,并产生头文件com_example_djstava_jnidemo_MyActivity.h,其内容为
根据产生的头文件,在同级目录创建C源文件,内容如下
打开build.gradle,在defaultConfig设置项内添加
在defaultConfig设置项后面添加
在MyActivity中加载jni模块
添加textView的id
前言
本文的目标是在Android studio中进行NDK的开发。示例是在main activity中显示一个字符串,而字符串的内容是来自于一个C函数。归结于一句话:NDK是为了让上层的java应用能够调用底层的c/c++而设计的。马上进入主题。
创建工程
创建一个名为jniDemo的blank activity工程,activity名为MyActivity,在MyActivity类的最后声明一个方法,这个方法会在C函数中去实现,如下图所示,
jni部分
设置ndk路径,打开local.properties,增加ndk.dir=/home/djstava/Workshop/Android/android-studio/ndk
点击android studio左下角的Terminal
cd src/main javah -d jni -classpath ~/Workshop/Android/android-studio/sdk/platforms/android-4.4.2/android.jar:../../build/intermediates/classes/debug/ com.example.djstava.jnidemo.MyActivity
参数意义:
-d 输出目录,jni是gradle默认的路径 -classpath jar的路径,经常碰到的找不到activity的类的错误一般是由这个引起的 com.example.djstava.jnidemo.MyActivity 包名+activity
这条命令执行完毕后,会在src/main下生成jni目录,并产生头文件com_example_djstava_jnidemo_MyActivity.h,其内容为
/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class com_example_djstava_jnidemo_MyActivity */ #ifndef _Included_com_example_djstava_jnidemo_MyActivity #define _Included_com_example_djstava_jnidemo_MyActivity #ifdef __cplusplus extern "C" { #endif #undef com_example_djstava_jnidemo_MyActivity_MODE_PRIVATE #define com_example_djstava_jnidemo_MyActivity_MODE_PRIVATE 0L #undef com_example_djstava_jnidemo_MyActivity_MODE_WORLD_READABLE #define com_example_djstava_jnidemo_MyActivity_MODE_WORLD_READABLE 1L #undef com_example_djstava_jnidemo_MyActivity_MODE_WORLD_WRITEABLE #define com_example_djstava_jnidemo_MyActivity_MODE_WORLD_WRITEABLE 2L #undef com_example_djstava_jnidemo_MyActivity_MODE_APPEND #define com_example_djstava_jnidemo_MyActivity_MODE_APPEND 32768L #undef com_example_djstava_jnidemo_MyActivity_MODE_MULTI_PROCESS #define com_example_djstava_jnidemo_MyActivity_MODE_MULTI_PROCESS 4L #undef com_example_djstava_jnidemo_MyActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING #define com_example_djstava_jnidemo_MyActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L #undef com_example_djstava_jnidemo_MyActivity_BIND_AUTO_CREATE #define com_example_djstava_jnidemo_MyActivity_BIND_AUTO_CREATE 1L #undef com_example_djstava_jnidemo_MyActivity_BIND_DEBUG_UNBIND #define com_example_djstava_jnidemo_MyActivity_BIND_DEBUG_UNBIND 2L #undef com_example_djstava_jnidemo_MyActivity_BIND_NOT_FOREGROUND #define com_example_djstava_jnidemo_MyActivity_BIND_NOT_FOREGROUND 4L #undef com_example_djstava_jnidemo_MyActivity_BIND_ABOVE_CLIENT #define com_example_djstava_jnidemo_MyActivity_BIND_ABOVE_CLIENT 8L #undef com_example_djstava_jnidemo_MyActivity_BIND_ALLOW_OOM_MANAGEMENT #define com_example_djstava_jnidemo_MyActivity_BIND_ALLOW_OOM_MANAGEMENT 16L #undef com_example_djstava_jnidemo_MyActivity_BIND_WAIVE_PRIORITY #define com_example_djstava_jnidemo_MyActivity_BIND_WAIVE_PRIORITY 32L #undef com_example_djstava_jnidemo_MyActivity_BIND_IMPORTANT #define com_example_djstava_jnidemo_MyActivity_BIND_IMPORTANT 64L #undef com_example_djstava_jnidemo_MyActivity_BIND_ADJUST_WITH_ACTIVITY #define com_example_djstava_jnidemo_MyActivity_BIND_ADJUST_WITH_ACTIVITY 128L #undef com_example_djstava_jnidemo_MyActivity_CONTEXT_INCLUDE_CODE #define com_example_djstava_jnidemo_MyActivity_CONTEXT_INCLUDE_CODE 1L #undef com_example_djstava_jnidemo_MyActivity_CONTEXT_IGNORE_SECURITY #define com_example_djstava_jnidemo_MyActivity_CONTEXT_IGNORE_SECURITY 2L #undef com_example_djstava_jnidemo_MyActivity_CONTEXT_RESTRICTED #define com_example_djstava_jnidemo_MyActivity_CONTEXT_RESTRICTED 4L #undef com_example_djstava_jnidemo_MyActivity_RESULT_CANCELED #define com_example_djstava_jnidemo_MyActivity_RESULT_CANCELED 0L #undef com_example_djstava_jnidemo_MyActivity_RESULT_OK #define com_example_djstava_jnidemo_MyActivity_RESULT_OK -1L #undef com_example_djstava_jnidemo_MyActivity_RESULT_FIRST_USER #define com_example_djstava_jnidemo_MyActivity_RESULT_FIRST_USER 1L #undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DISABLE #define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DISABLE 0L #undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DIALER #define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_DIALER 1L #undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SHORTCUT #define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SHORTCUT 2L #undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_LOCAL #define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L #undef com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_GLOBAL #define com_example_djstava_jnidemo_MyActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L /* * Class: com_example_djstava_jnidemo_MyActivity * Method: getStringFromJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_djstava_jnidemo_MyActivity_getStringFromJNI (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
根据产生的头文件,在同级目录创建C源文件,内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class com_example_djstava_jnidemo_MyActivity */ /* * Class: com_example_djstava_jnidemo_MyActivity * Method: getStringFromJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_djstava_jnidemo_MyActivity_getStringFromJNI (JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env,"Hello android from jni!"); }
gradle配置
打开build.gradle,在defaultConfig设置项内添加ndk { moduleName "jniLib" //这是模块名称,在加载时会被用到 }
在defaultConfig设置项后面添加
flavorGroups "abi" productFlavors { x86 { ndk { abiFilter "x86" } } arm { ndk { abiFilter "armeabi-v7a" } } mips { ndk { abiFilter "mips" } } }
在MyActivity中加载jni模块
修改activity_my.xml
添加textView的idandroid:id="@+id/jni_text"
相关文章推荐
- 快速理解RequireJs
- UIView实现动画效果
- AsyncTask介绍
- UIView之userInteractionEnabled属性介绍
- hdu5412CRB and Queries(整体二分)
- WPF:如何在工作线程中更新窗体的UI元素(Dispatcher机制)
- UIView 的Transform。(旋转,缩放,3D旋转)
- UIScrollView
- 自定义UIPageControl 的Circle 与其他实现方式有几行代码改动,亲自试过
- iOS 3D UI---CALayer的transform扩展
- [LeetCode] Unique Paths
- forward与include转发问题(RequestDispatcher.include()(乱码问题分析及解决)
- Mix and Build(简单DP)
- Mix and Build(简单DP)
- UITextField详解
- 解决query不到本地视频方法
- 设置UIView的背景色和背景图片
- QT 总结(四) 1.中文编码 乱码 2.QFileDialog 打开文件框 3.调用其它UI文件 4.QMessageBox弹窗
- How To Build Compelling Stories From Your Data Sets
- HDU 1387 Team Queue(优先队列)