之前一直都不知怎么编写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的更多相关文章

  1. 利用Android Studio编写 Android上的c与c++程序

    利用Android Studio编写 Android上的c与c++程序 (2017-05-22 19:01:20) 转载▼ 标签: android 分类: Android开发 原文链接: http:/ ...

  2. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  3. Android studio 配置JNI环境

    Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...

  4. Android Studio编写运行测试纯java代码可带main()函数

    问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...

  5. Android Studio使用JNI

    0x01 前言 本文讲述使用Android Studio通过静态注册.动态注册使用JNI的方法,以及加载第三方so文件的方法 0x02 Android Studio静态注册的方式使用JNI 1. 添加 ...

  6. 利用android studio 生成 JNI需要的动态库so文件

    JNI:  Java Native Interface,  提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...

  7. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  8. android studio的jni和so

    1. android studio自己添加代码生成so 代码地址:https://github.com/maogefff/Android-Test-Sample/tree/master/MyJni 参 ...

  9. 呕心沥血Android studio使用JNI实例

    发现网上很多JNI的使用教程,也很详细,不过有的地方有些缺漏,导致很多小问题难以解决的,今天就来总结一下. 准备工作:下载NDK. 简单的说,要用到C/C++,就要用NDK.直接百度搜索然后去官网下载 ...

随机推荐

  1. Adobe Audition3.0 找不到所支持的音频设备 请检查您的音频设置

      Adobe Audition 找不到所支持的音频设备 请检查您的音频设置   解决方案:   运行regedit,打开注册表编辑器,定位到 HKEY_CLASSES_ROOT\CLSID\{AB7 ...

  2. Android中如何判断升级用户

    借助PackageInfo 转自:http://blog.saymagic.cn/2016/05/31/howto-judge-update-user.html 由于上面两种自定义的逻辑都不能很好的满 ...

  3. ant design pro (九)引入外部模块

    一.概述 原文地址:https://pro.ant.design/docs/import-cn 除了 antd 组件以及脚手架内置的业务组件,有时我们还需要引入其他外部模块,这里以引入富文本组件 re ...

  4. 17、Cocos2dx 3.0游戏开发找小三之内置的经常使用层:三剑客LayerColor、LayerGradient、Menu

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30477587 为了方便游戏开发人员.Cocos2d- ...

  5. 不经意的小错误——onclick和click的区别

    可能注意不到的错误,编写jquery时发现没有自己想要的效果,结果通过代码比对软件才发现原来将click写成了onclick,虽然看着差不多,但意义却不相同,简单区别如下: $().click() 是 ...

  6. nginx配置静态文件过期时间

    1. 编辑虚拟主机配置文件/usr/local/nginx/conf/vhosts/huangzhenping.conf 说明:采用location方式 1 2 3 4 5 6 7 8 9 10  l ...

  7. cygwin下安装scws

    安装gcc和make命令 1.找到cygwin的etc目录中有一个名为passwd的文件.   2.用UE或记事本打开passwd这个文件,找到以下部分,把其中的windows用户名admin换成ro ...

  8. jasmine-行为驱动测试

    http://jasmine.github.io/1.3/introduction.html,先保留着,好好研究.

  9. 使用rman备份异机恢复数据库

    一.RMAN备份源库注意点: 最好保留rman备份日志 $rman target / log=backup.log RMAN>run { allocate channel t1 type dis ...

  10. C++模板类内友元(友元函数,友元类)声明的三种情况

    根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{     void bar(); ...