AndroidStudio上使用NDK(Jni)的配置
来源:互联网 发布:网络答题 搜题软件 编辑:程序博客网 时间:2024/05/22 07:48
第一步就是去官方下载个NDK包就可以了,存放地址随意(自己记得就行))
第二步 就是就是直接写代码了(NDK怎么和AS工程关联,也就是一行配置的问题)
内容步骤讲解:
- 在AS中新建一个Project,然后再新建一个class为NDKUtil(名字随意),在内部声明native方法(jni使用的定义,后面系列教程会细说)。
package com.example.administrator.ma;/** * jni使用的定义 */public class NDKUtil { //返回的类型以及方法名随意 public native String getName();}
- 在工程主文件Activity中写入如下代码调运JNI的东西显示在UI上。
package com.example.administrator.ma;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends Activity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialize(); } private void initialize() { tv = (TextView) findViewById(R.id.tv); //实例化NDKUtil的对象,并调用方法 NDKUtil jni =new NDKUtil(); //将.c文件中的内容显示在控件上 tv.setText(jni.getName()); }}
- 然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后(在AS工程里没有任何的表现,找到Project所在的位置)生成的class文件在AS工程的如下目录:
E:\test\MA\app\build\intermediates\classes\debug
- 然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。
- 点开AS的Terminal标签(在最左下),默认进入到该项目的app文件夹下。我在windows平台下输入如下命令跳转到class中间文件生成路径:
E:\test\MA>cd E:\test\MA\app\build\intermediates\classes\debug
- 然后执行如下javah命令生成.h文件。
######classes\debug>javah -jni com.example.administrator.ma.NDKUtil
- 执行完之后你可以在文件夹(我的工程的全路径)E:\test\MA\app\build\intermediates\classes\debug 下看见生成的 .h头文件为:
com_example_administrator_ma_NDKUtil.h
- 其内容为(自动生成的文件):
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_administrator_ma_NDKUtil */#ifndef _Included_com_example_administrator_ma_NDKUtil#define _Included_com_example_administrator_ma_NDKUtil#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_administrator_ma_NDKUtil * Method: getName * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_administrator_ma_NDKUtil_getName (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
- 在工程的main目录下新建一个名字为jni的目录,(第一):将刚才的 .h文件剪切过来;(第二):在jni目录下新建一个c文件,随意取名,我的叫jnitest.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):
#include "com_example_administrator_ma_NDKUtil.h"/* * Class: io_github_yanbober_ndkapplication_NdkJniUtils * Method: getCLanguageString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_administrator_ma_NDKUtil_getName (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"Hello NDK--JNI"); }
- 接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:
sdk.dir=E\:\\as2.1\\sdkndk.dir=D\:\\ndk\\android-ndk-r10b
- 接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:
defaultConfig { ... ndk{ //生成的so名字(要用) moduleName "MyTestJni" //输出指定三种abi体系结构下的so库。目前可有可无。 abiFilters "armeabi", "armeabi-v7a", "x86" } }
- 现在生成的so库名字也有了,那就去代码的NDKUtil.Java文件添加静态初始化load代码,添加如下:
package com.example.administrator.ma;/** * jni使用的定义 */public class NDKUtil { public native String getName(); //添加静态初始化 static { System.loadLibrary("MyTestJni"); }}
- 最后一步,在gradle.properties中添加(支持ndk) 以下的语句
android.useDeprecatedNdk=true
- 好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。
==============================================
- 错误1
但是有些电脑好奇怪此时编译会报错,没辙,后来网上找到答案说这是NDK在Windows下一个bug,当只编译一个单一文件时出现,解决办法就是再添加一个空的文件就行了。 这个网站有介绍:NDK在Windows的一个bug。
- 错误2
Error:Execution failed for task ‘:app:clean’.
Unable to delete directory: E:\test\Study_nkd\app\build\intermediates\classes\debug
解决办法:关闭AndroidStudio,删除debug文件夹!!!!
(上面所指的路径)
然后打开AS直接运行(可能需要运行两次)
0 0
- AndroidStudio上使用NDK(Jni)的配置
- AndroidStudio 如何使用NDK JNI
- AndroidStudio 进行 JNI / NDK 开发:初步配置及使用
- 第一篇:AndroidStudio NDK的配置和使用,jni的第一个demo
- JNI学习一(AndroidStudio NDK环境配置)
- AndroidStudio的NDK配置
- AndroidStudio之NDK与JNI配置详解
- AndroidStudio如何配置NDK/JNI开发环境
- AndroidStudio如何配置NDK/JNI开发环境
- AndroidStudio如何配置NDK/JNI开发环境
- AndroidStudio如何配置NDK/JNI开发环境
- AndroidStudio配置NDK/JNI开发环境细节
- AndroidStudio如何配置NDK/JNI开发环境
- AndroidStudio配置NDK/JNI开发环境
- 配置NDK,使用JNI
- AndroidStudio使用NDK配置方法
- AndroidStudio使用NDK配置方法
- AndroidStudio使用NDK配置方法
- latex图表标题样式设置
- iOS开发数据存储篇—libsqlite3和FMDB的基本使用和区别
- linux安装opencv
- ios关于百度地图框架地理编码的封装;
- 浏览器探针--JavaScript
- AndroidStudio上使用NDK(Jni)的配置
- ORACLE用户A导出给用户B
- 标准字符串std::string和System::String, CString之间的转换
- SSH框架----hibernate 反转成关系照射和实体类 mysql hibernate 反转成关系映射和实体类 mysql
- H264 JM8.6 注释版代码
- UVa Box 1587
- hive关系运算详解
- Hibernate5
- Spark在线广告点击预测