Android Studio 编写 JNI
之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档。
参考链接
http://blog.csdn.net/u011168565/article/details/51878176
http://www.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
创建一个jni类(.java文件)
1. 创建Android studio 工程
2. 切换到project视图
3. 创建jni类如下所示
package com.example.tony.jnidemo;
/**
* Created by Tony on 2016/7/19.
*/
public class JNITest {
public native String getJNIString(); // jni接口函数
static {
System.loadLibrary("hello-jni"); //加载jni动态库,只写库名,库名称是在build.gradle中指定的。
}
}
生成.class文件
点击导航栏build-> Make Module "app", 编译jni类(.java文件),生成.class文件
生成的.class文件在app/build/intermediates/classes/debug目录中
生成.h文件
1. 打开终端,切换到debug目录
JNIDemo\app\build\intermediates\classes\debug
2. 在debug目录下生成.h文件
在终端输入命令
javah com.example.tony.jnidemo.JNITest
//com.example.tony.jnidemo是包名,JNITest是类名;
在debug目录下,生成文件com_example_tony_jnidemo_JNITest.h
编写jni源代码
1. 复制debug目录的.h文件
2. 在app/src/main目录下创建jni目录(一定要是小写的)
3. debug目录中的.h文件粘贴到jni目录中。
4. 在jni目录中创建.c文件,文件名称自己取。
5. 复制.h文件中的内容到.c文件中。并实现其中的函数,如下所示,返回一个jstring类型。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_tony_jnidemo_JNITest */
#ifndef _Included_com_example_tony_jnidemo_JNITest
#define _Included_com_example_tony_jnidemo_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_tony_jnidemo_JNITest
* Method: getJNIString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_tony_jnidemo_JNITest_getJNIString
(JNIEnv *env, jobject thisObj) {
return (*env)->NewStringUTF(env,"Hello World");
}
#ifdef __cplusplus
}
#endif
#endif
配置gradle文件
打开buidle.gradle,添加ndk内容,指定动态库名称和处理器架构
defaultConfig {
applicationId "com.example.aplex.jnidemo"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
//在JNI打log 必须加上log,否则会报错log函数未定义,
ldLibs "log"
//指定生成模块名字,也就是最终的动态库名hello-jni,相应库文件名libhello-jni.so moduleName "hello-jni"
moduleName "hello-jni"
// 指定生成哪些处理器架构的动态库文件,如果要运行在x86架构处理器一定需要指定 abiFilters "armeabi" , "x86"
abiFilters "armeabi" , "x86"
}
}
添加ndk
打开gradle.properties在文件最后添加。
android.useDeprecatedNdk=true
否者编译会出错。
至此,jni编写完毕,点击导航栏中的图标(Sync Project with Gradle Files),生成gradle文件,就可以调用JNI的类了。
Author
Tony Liu
2016-7-19, Shenzhen
Android Studio 编写 JNI的更多相关文章
- 利用Android Studio编写 Android上的c与c++程序
利用Android Studio编写 Android上的c与c++程序 (2017-05-22 19:01:20) 转载▼ 标签: android 分类: Android开发 原文链接: http:/ ...
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- Android studio 配置JNI环境
Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...
- Android Studio编写运行测试纯java代码可带main()函数
问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...
- Android Studio使用JNI
0x01 前言 本文讲述使用Android Studio通过静态注册.动态注册使用JNI的方法,以及加载第三方so文件的方法 0x02 Android Studio静态注册的方式使用JNI 1. 添加 ...
- 利用android studio 生成 JNI需要的动态库so文件
JNI: Java Native Interface, 提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...
- android studio的jni和so
1. android studio自己添加代码生成so 代码地址:https://github.com/maogefff/Android-Test-Sample/tree/master/MyJni 参 ...
- 呕心沥血Android studio使用JNI实例
发现网上很多JNI的使用教程,也很详细,不过有的地方有些缺漏,导致很多小问题难以解决的,今天就来总结一下. 准备工作:下载NDK. 简单的说,要用到C/C++,就要用NDK.直接百度搜索然后去官网下载 ...
随机推荐
- Cocos2d-x 处理双击事件的两种方法
在cocos2d-x的开发过程中有些时候也是需要用到双击的事件处理,那么由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现. 下面介绍两种方式实现双击事件的处理. (一 ...
- MQTT---HiveMQ源代码具体解释(十八)Cluster-kryo与Serializer
源博客地址:http://blog.csdn.net/pipinet123 MQTT交流群:221405150 既然是Cluster,node之间肯定是须要交互的,那么肯定是须要序列化和反序列化.Hi ...
- Android Studio之多个Activity的滑动切换(二)
1.因为Android界面上的全部控件一般都位于Layout控件(比方RelativeLayout)之上,而布局控件能够设置响应touch事件,所以能够通过布局控件的setOnTouchListen来 ...
- Selenium WebDriver问题--Internet Explorer保护模式设置问题
在用WebDriver中打开Internet Explorer访问百度的是,报下面错误: org.openqa.selenium.remote.SessionNotFoundException: Un ...
- Python list添加新元素
append()和insert() 添加新元素现在,班里有3名同学:>>> L = ['Adam', 'Lisa', 'Bart']今天,班里转来一名新同学 Paul,如何把新同学添 ...
- sql中同一个Trigger里同时包含Insert,Update,Delete
sql中同一个Trigger里同时包含Insert,Update,Delete SQLServer是靠Inserted表和Deleted表来处理的,判断一下就可以了,只不过比ORACLE麻烦一点 cr ...
- 深度介绍Linux内核是如何工作的
本文发表于Linux Format magazine杂志,作者从技术深度上解释了Linux Kernel是如何工作的.相信对Linux开发者来说有不小的帮助. 牛津字典中对"kernel&q ...
- Android 应用开发实例之情景模式
2013-07-01 Android 应用开发实例 1. 情景模式 使用TabHost来实现主界面的布局. 设置一组RadioButton来切换不同的情景模式. 对比普通情景模式,定时情景模式需要加上 ...
- git eclipse 不标记修改后的文件(没有图标标明)
在使用Eclipse做开发的时候,已经修改了某个文件,但是文件的图标没有明显的标示,如图: 解决上面问题的办法如下:
- gdb前端: VIM+Pyclewn 调试C/C++
(gdb) mapkeys C-B : break "${fname}":${lnum} # set breakpoint at current line C-D : down C ...