Android Studio使用JNI和NDK进行开发
想要学习一下在Android Studio中进行JNI的开发,文章挺多的,但是几乎没有一个完整的说明的,中间总是有一两步漏掉。分享技术就应该完整的让读者学会,藏着掖着不是君子所为。对于那些故意含糊过去的,我只想说Navie!
转载请注明出处 http://www.cnblogs.com/qiusuo/p/5656625.html
正文
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
Android NDK(Native Development Kit )是一套工具集合,允许你用像C/C++语言那样实现应用程序的一部分。
- 在使用NDK之前需要配置NDK和LLDB
通过使用SDK Manager找到NDK和LLDB,进行安装
按照一般方法,创建一个Android应用
File - New - New Project- 创建一个新的Java Class(与MainActivity一个目录),类名为JniDemo,其中有一个Native方法
package com.example.angel.myapplication; /**
* Created by Angel on 2016/7/8.
*/
public class JniDemo {
public native String getJniMessage();
} - 编译JniDemo.java这个带有Native方法的类
在命令提示符中,cd到文件所在目录,执行javac JniDemo.java,可以看到目录中生成了对应的.class文件 - 生成对应的.h头文件
a) 在命令提示符中,cd到src/main/java文件夹中(内部的目录结构是包名,例如我的包名是com.example.angel.myapplication,目录结构为/src/main/java/com/example/angel/myapplication)
b) 执行javah com.example.angel.myapplication.JniDemo,会在当前目录生成head file(.h)文件。 - 在Project树形目录下app - src - main,建立jni folder,并将head file放到里边

- 在jni文件夹中创建C/C++源文件,并include这个头文件,实现其中的方法。
#include "com_example_angel_myapplication_JniDemo.h"
JNIEXPORT jstring JNICALL Java_com_example_angel_myapplication_JniDemo_getJniMessage
(JNIEnv *, jobject)
{
return (*env)->NewStringUTF(env,"Jni Message: Hello World!");
} - build - Rebuild Project后,会出现一个错误。并且给出了解决方案:Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
在gradle.properties中添加一行android.useDeprecatedNdk=true - build - Rebuild Project后,又会出现warming,NDK option is not configured。按照提示,进行如下内容的添加:
在app的build.gradle文件中,添加如下内容:android {
sourceSets {
main {
jniLibs.srcDir 'src/main/jni'
}
}
}并且自定义so库的名称
android {
......
defaultConfig {
......
ndk {
moduleName 'jnidemo'//自定义名称
}
}
}如果不这么做的话,生成的库文件名称是[lib][module name].so
- build - Rebuild Project,可以看到生成了so文件
在目录:app - build - intermediates - ndk - debug - lib下
- 加载so文件。
so文件加载一次便可以使用,一般情况下,在静态代码段中进行加载static {
System.loadLibrary("jnidemo");
} - 使用Native方法
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("jnidemo");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final JniDemo jniDemo = new JniDemo();
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(jniDemo.getHelloWordText());
}
} - Native方法使用java代码
在Java代码中,创建如下方法,用以在Native代码中调用protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sContext = getApplicationContext();
}
private static Context sContext;
public static void showToast() {
Toast.makeText(sContext, "此方法由Native方法调用", Toast.LENGTH_SHORT).show();
}在Native代码中,使用如下代码进行调用
//找到我们要调用的方法,注意包名+类名
jclass clazz = (*env)->FindClass(env,"com/example/angel/myapplication/MainActivity");
//获取某个静态方法的ID
//clazz 是我们上面找到的类的字节码文件
//showToast 是clazz类中的方法名
//"()V" 这个表示方法的签名;()是方法的参数列表;V表示方法的返回类型;V -> void
jmethodID id = (*env)->GetStaticMethodID(env,clazz, "showToast","()V");
//最后调用这个方法,CallStaticVoidMethod(clazz,方法ID)
(*env)->CallStaticVoidMethod(env,clazz,id);
Android Studio使用JNI和NDK进行开发的更多相关文章
- Android Studio通过JNI调用NDK程序
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些,安全性更高. 如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配 ...
- 使用Android Studio自带的NDK编译JNI
/********************************************************************************** * 使用Android Stud ...
- Android studio 配置JNI环境
Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- Android Studio && GitHub 团队多人一起开发
曾几何时,花了两天的时间搞了合并项目,搞得乱七八糟der,但最终还是被我搞定了,too 乱 to 做笔记.过了几个月,也就是前几天,抱着从头开始的决心,再次尝试,然鹅并没有结果.今天,再一次重新开始, ...
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...
- [Android] AndroidStudio + JNI(NDK)开发相关总结
1.官方推荐JNI构建方案 从Android studio 2.2 开始,Google推荐的JNI开发构建工具是CMake而不是NDK,参考官方文档:https://developer.android ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
随机推荐
- <读书笔记>软件调试之道 :问题的核心-诊断
声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记. 不要急于动手! 尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智 ...
- XP局域网内专用消息队列
网上能找到DELPHI消息队列的方法,在XP下试了总是不成功,后来在2003上试就行了,对比发现消息队列属性->安全 2003中多了个用户ANONYMOUS_LOGON. 然后在XP下消息队列属 ...
- Res_Orders_01需求分析
一.背景及好处 为了提高餐厅的运营效率,增强餐厅各部门间的配合,减少顾客到店后的点餐.等餐及结算过程消耗的时间,降低服务员点餐失误率,进一步提高餐厅管理人员对菜品.资金的管理以及更好的掌握餐厅的全局运 ...
- shell生成随机数的几种方法
一.通过内部系统变量($RANDOM) 生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余. [root@web01 scripts]# echo $RANDOM [r ...
- Java入门记(一):折腾HelloWorld
HelloWorld,学习每门语言的第一步.有人戏称,这些年的编程生涯就是学习各种语言的HelloWorld,不知是自谦还是自嘲.目前所在的公司使用Java作为主要开发语言,我进行语言转换也大半年了, ...
- varchar(n),nvarchar(n) 长度、性能、及所占空间的说明
varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...
- 4.struts2中的文件上传,下载
Struts2中文件的上传下载,是借用commons里面的包实现文件的上传,需要导入两个jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 实现 ...
- <textarea>没有内容时,按回车键,设置光标不换行
$("textarea").val($("textarea").val().replace(/\n/g,""));
- html5的新标签
header,section,footer,aside,nav,main,article,figure 在使用的时候,需要先把这个元素变为块级元素,确保在老的浏览器里面可以使用.因为在浏览器检测到未知 ...
- 修改tomcat的端口