文档章节

Android Studio 用 JNI 实现与原生代码通信

vwarship
 vwarship
发布于 2015/02/27 13:11
字数 378
阅读 152
收藏 4

开发步骤

1.创建 HelloJNI 类

package com.zaoqibu.hellojni;public class HelloJNI {
    public native String  stringFromJNI();
    static {
        System.loadLibrary("hello-jni");
    }
}
  • 原生方法的声明 public native String stringFromJNI();

  • 静态加载共享库,System.loadLibrary("hello-jni");。库的名字在 jni/Android.mk 文件中定义的 LOCAL_MODULE 变量。

2.使用 javah 生成 JNI 头文件

通过 Java 类生成头文件。

D:\Samples\Android\NDK\HelloJNI\app\src\main\java>javah com.zaoqibu.hellojni.HelloJNI

通过 class 生成头文件。(使用前得编译出 class 才能用)

D:\Samples\Android\NDK\HelloJNI\app>javah -classpath build/intermediates/classes/debug com.zaoqibu.hellojni.HelloJNI

3.增加 jni 目录及文件

src
jni\
    Android.mk
    Application.mk
    com_zaoqibu_hellojni_HelloJNI.h
    com_zaoqibu_hellojni_HelloJNI.c

4.原生方法的实现 com_zaoqibu_hellojni_HelloJNI.c

#include <com_zaoqibu_hellojni_HelloJNI.h>
#include <string.h>
JNIEXPORT jstring JNICALL Java_com_zaoqibu_hellojni_HelloJNI_stringFromJNI(
JNIEnv *env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI!");
}

5.构建共享库的描述 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := com_zaoqibu_hellojni_HelloJNI.c

include $(BUILD_SHARED_LIBRARY)

6.生成所有支持的CPU体系结构的共享库 Application.mk

APP_ABI := all

7.编译共享库 ndk_build

D:\Samples\Android\NDK\HelloJNI\app\jni>ndk_build
  • 生成共享库到 libs 目录。

8.修改 app 构建文件 build.gradle,打包 APK 时,增加共享库。 在 android 中增加

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

修改后

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.zaoqibu.hellojni"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

9.调用原生方法。HelloJNIActivity.java

public class HelloJNIActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hellojni);        
        HelloJNI helloJNI = new HelloJNI();        
        String hello = helloJNI.stringFromJNI();        
        TextView textView = (TextView)findViewById(R.id.textView);
        textView.setText(hello);
    }

}

10.运行

参考

JNI Tips

Android Studio: Android Manifest doesn't exists or has incorrect root tag


© 著作权归作者所有

共有 人打赏支持
vwarship

vwarship

粉丝 6
博文 2
码字总数 810
作品 8
济南
高级程序员
私信 提问
Android:随笔——新的 NDK/JNI 调用方式

转载请标明地址 QuincySx: http://www.jianshu.com/p/c6108131ba0f 众所周知现在 Android 开发已经到了 Android Studio 的时代,那么 JNI 的调用方式也经过了好几代 在eclipse 时代就存在的...

quincy
2017/04/05
0
0
Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Intel® INDE for Google Android Studio

Intel 开发者社区提供工具,并且为跨平台应用程序开发,以及平台、技术信息、代码示例和同行工作人员提供指南信息,以此来帮助开发人员创新与成功。为 Android,物联网,Intel® RealSense™...

oschina
2015/04/08
5.4K
8
Android Camera 系统框架分析

一、在android中开发人员可以做那些工作? 应用程序开发:利用android提供的强大的sdk,开发出各种各样新颖的应用。 系统开发:在android中Google实现了与硬件无关的所有代码,但是与硬件密切...

Jerikc
2012/11/05
0
0
在android studio中集成javah, ndk-build进行JNI开发

最近在搞一个android上控制LED灯闪烁的功能,用到了串口编程,搜索了一下,发现Google发布了一个demo,android-serialport-api。有现成的代码和APK,要想自己改JNI也比较简单,就一个C文件。...

LeoLiang
2018/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

全面理解Java内存模型(JMM)及volatile关键字

理解Java内存区域与Java内存模型 Java内存区域 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的...

亭子happy
30分钟前
1
0
Prometheus监控mysql实例--centos7安装mysql_exporter

目录 概述 环境准备 普罗米修斯简介 mysql安装 mysqld_exporter安装 启动参数列表 概述 prometheus(普罗米修斯) 是一个开源系统监控和报警工具包,许多公司和组织都采用了Prometheus,该项目...

java_龙
35分钟前
5
0
拥有2000家门店,他如何晋升为服装界的新宠?

摘要: —— iwarm3.0加热组件、碳纳米管膜炎、管状石墨结构体...你看到并不是一款高科技电子产品,这是快鱼服饰在这个冬天推出的黑科技产品 - 智能温控羽绒服。 在竞争激烈的服装行业,快鱼...

阿里云云栖社区
37分钟前
2
0
不忘初心 砥砺前行-智和信通2018年年会报道

1月18日,智和信通以“不忘初心 砥砺前行”为主题的2018总结会议暨2019年年会在京召开。年会以总经理李少龙的讲话为开场,充分肯定了全体员工2018年的工作和成绩,并表达了公司产品智和网管平...

智和网管平台
46分钟前
1
0
NGINX api网关

nginx配置 vi nginx.conf include /usr/local/nginx/conf/api/gateway.conf; # 所有的API网关配置 include /usr/local/nginx/conf/vhosts/*.conf; # 正常web域名配置......

以谁为师
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部