转载:http://www.androidchina.net/5744.html

进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C 、C++ 写的,那么在 Android 中怎么调用底层的库呢?这里就需要了解 JNI 技术。

Android Studio 出来两年多了,网上针对 AS 开发 JNI 工程资源比较少,针对于此,我特意写下本篇博客,希望能对大家有所帮助。

配置环境

  • 项目关联NDK ,具体操作如图:

右键你的工程项目,选择 【Open Module Settings】

在 【Android NDK location】配置 NDK 的按着目录:

最后在 项目根目录 【gradle.properties】 下加上:

android.useDeprecatedNdk=true

如图:

JNI实现

新建 JNI_DEMO 项目,完成以上的配置工作。我的项目路径为:D:\Android_Study_Demos\JNI_DEMO

生成 .h 文件

新建TestJNI

public class TestJNI {

   public native String HelloWord(String str);

}

cmd命令下面,cdjava目录,输入javah -jni com.github.jni_demo.TestJNI命令,生成 .h 文件:

注意:com.github.jni_demo.TestJNI 不能 cd com , cd github……否则编译不成功。

你会发现在你的java路劲下生成了com_github_jni_demo_TestJNI.h文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_github_jni_demo_TestJNI */ #ifndef _Included_com_github_jni_demo_TestJNI
#define _Included_com_github_jni_demo_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_github_jni_demo_TestJNI
* Method: HelloWord
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord
(JNIEnv *, jobject, jstring); #ifdef __cplusplus
}
#endif
#endif

然后右键 app >NewFolder > JNI Folder 生成jni目录如图:

然后拷贝com_github_jni_demo_TestJNI.hjni目录下面:

生成 .C 文件

右键jni,生成com_github_jni_demo_TestJNI.cpp文件:

拷贝以下代码到 .cpp 文件中:

#include <stdio.h>
#include <stdlib.h>
#include "com_github_jni_demo_TestJNI.h"
JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord
(JNIEnv *env, jobject, jstring str) {
return str;
}

build.gradle 配置 ndk

defaultConfig节点下加入如下代码:

        ndk {
moduleName "TestJNI"
abiFilters "armeabi", "armeabi-v7a", "x86"
}

点击 Build > Make Project 如图:

编译成功后,打开 build > intermediates > ndk > debug > lib 下查看生成的 .so 文件:

Java中调用JNI

记得把生成的 .so 文件拷贝到项目的 libs 目录下:

接着在Java中调用JNI

package com.github.jni_demo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; public class MainActivity extends AppCompatActivity {
static { // 加载动态库
System.loadLibrary("TestJNI");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TestJNI testJNI=new TestJNI();
Log.e("---------------","************"+testJNI.HelloWord("恭喜你,调用成功!"));
}
}

这样你就生成了一个属于自己的 .so 文件。

Android Studio JNI 开发简单案例的更多相关文章

  1. Android Studio JNI开发入门教程

    Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报  分类: JNI(3)    目录(?)[+]   概述 在Andorid ...

  2. 实现Android Studio JNI开发C/C++使用__android_log_print输出Log

    相信很多人在刚开始学习Android JNI编程的时候,需要输出Log,在百度Google搜索的时候都是说需要在Android.mk中加入LOCAL_LDLIBS+= -L$(SYSROOT)/usr ...

  3. NDK工具开发Jni,Android studio jni开发

    NDK工具开发JNI 对于JNI的作用,我这边就不详细说明了,百度google 有很多这样的介绍,这边着重详解AS使用NDK工具开发,调C的流程. 1,创建工程 2,创建native方法 //该类的路 ...

  4. Android Studio获取开发版SHA1值和发布版SHA1值,详细过程

    转自原文 Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法 前言: 今天我想把百度地图的定位集成到项目中来,想写个小小的案例,实现一下,但在集成百度地图时首先要申请秘 ...

  5. 【Android】Android Studio NDK 开发

    Android Studio NDK 开发 记录在Android Studio中NDK简单开发的步骤 用到的Android Studio版本为3.5. 配置NDK 下载NDK 一般在SDK下已经有自带 ...

  6. android下JNI开发

    android下JNI开发 what 什么是JNI JNI java native interface native本地 java本地接口 通过JNI可以实现java和本地代码之间相互调用 jni可以 ...

  7. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  8. Android Studio 蓝牙开发实例——基于Android 6.0

    因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结. 该应用的Compile Sdk Version ...

  9. cordova开发插件,并在android studio中开发、调试

    之前用过cordova Lib包装H5页面,自己写插件,但做法是野路子,不符合cordova插件的开发思路,这次项目又需要包装H5页面,同时需要自定义插件.所以又折腾了一次cordova自定义插件. ...

随机推荐

  1. C3p0连接池配置

    在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Connection co ...

  2. Json map

    1. 返回数据形式 Class returnMsg{ boolean success; String   msg; String   errorMsg; } 2.问题 当msg中的数据由对象 或 集合 ...

  3. redis开启远程访问

    redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf   打开redis.conf文件在NETWORK部分有说明   ######################### ...

  4. shiro在springmvc里面的集成使用【转】

    <dependency> <groupId>commons-collections</groupId> <artifactId>commons-coll ...

  5. 【HTML5&CSS3进阶03】Jser与Csser如何一起愉快的翻新老组件

    上次,我们形成了两种header的布局,一种flexbox,一种float,最后与身边做重构的同事交流下来,选择了float的布局. 事实上布局的选型不需要我关注,我的参与或者一些意见多数是自我提升, ...

  6. SVG动画

    动画原理 SVG动画,就是元素的属性值关于时间的变化. 如下图来说,元素的某个属性值的起始值(from)到结束值(to)在一个时间段(duration)根据时间函数(timing-function)计 ...

  7. MarkdownPad 2 常用快捷键

    Ctrl + I : 斜体 Ctrl + B : 粗体 Ctrl + G : 图片 Ctrl + Q : 引用 Ctrl + 1 : 标题 1 Ctrl + 2 : 标题 2 Ctrl + 3 : 标 ...

  8. Android无需申请权限拨打电话

    Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data ...

  9. android版扫扫图书应用源码

    书,是人类的灵魂. 扫扫图书是一个让你懂得如何去选择一本书的APP. 这里你可以扫描条形码查询图书, 你也可以关键字搜索,遇到合乎你口味的书, 你还可以看看别人的读书笔记,不同角度去体会. 注:请允许 ...

  10. ssl + nginx + tomcat 部署方案

    安装make yum -y install gcc automake autoconf libtool make 安装g++ yum install gcc gcc-c++ 安装PCRE cd /us ...