文档章节

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

vwarship
 vwarship
发布于 2015/02/27 13:11
字数 378
阅读 151
收藏 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的常用方法...

隔壁老李头
05/09
0
0
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
08/04
0
0
React Native SDK for OSS

此文主要介绍 React Native SDK for OSS的方方面面,包括相关基本概念、项目背景、项目方案、环境搭建运行、使用姿势、注意事项等。文末的附件可运行Example Zip压缩包和针对新手的入门实用文...

zuozhao
05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Rotate Array(leetCode189)

Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: [1,2,3,4,5,6,7] and k = 3Output: [5,6,7,1,2,3,4]Explanation:rotate 1 s......

woshixin
14分钟前
0
0
给女朋友讲解什么是Optional【JDK 8特性】

前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本《与孩子一起学编程》的书,于是今天就给女朋友讲解一下什么是Optional类。 至于她能不能看懂,那肯定是看不懂的。(学到...

Java3y
34分钟前
1
0
2019年六大新兴信息安全方向

导读 黑客攻击和网络犯罪的威胁正在不断升级,相应的技术“军备竞赛”正愈演愈烈,对于信息安全从业人员来说,掌握最新的信息安全工具,是在信息安全战争中生存下来的关键所在。 从特朗普的手...

问题终结者
41分钟前
1
0
redis扩展-自定义PropertyPlaceholderConfigurer,在spring属性注入之前,手动将properteis合并到spring容器中

背景:spring容器启动过程中,通过PropertyPlaceholderConfigurer读取properties配置文件,并将properties配置文件中的值注入spring bean的属性中, PropertyPlaceholderConfigurer使用方式多...

燃犀
43分钟前
0
0
PostgreSQL SPI 中的错误处理

PostgreSQL SPI 用于在 C 或是其他编程语言编写的扩展函数(存储过程)中调用数据库本身的解析器、规划器和执行器的功能,以及对 SQL 语句进行执行。 在最重要的一个函数 SPI_execute 的文档...

helloclia
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部