Android_JNI_Learn

栏目: Java · 发布时间: 8年前

内容简介:Android_JNI_Learn

下载安装CMake、LLDB、NDK

Android Studio的一些配置

手动添加一些快捷方式Tools->External Tools->add

javah   用于生成头文件
Program:$JDKPath$/bin/javah
Parameters:-d ../jni -jni $FileClass$
Working directory:$SourcepathEntry$\..\java
ndk-build   用于构建so包
注意:MAC/Linux用ndk-build,没有.cmd后缀
Program:D:\adt\sdk\ndk-bundle\ndk-build.cmd
Parameters:什么都不用填
Working directory:$ModuleFileDir$\src\main

在新建项目的时候默认会配置好所有的环境,如果是旧的项目需要以下准备:

在gradle.properties文件中添加对过时的NDK的兼容使用

android.useDeprecatedNdk=true

在模块的 build.gradle 里面添加

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

CMakeLists文件

CMakeLists.txt是CMake的配置文件,用于表明版本、依赖、等信息。

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib SHARED src/main/cpp/native-lib.cpp)

find_library(log-lib log)

target_link_libraries(native-lib ${log-lib})

对应的解释

cmake_minimum_required(VERSION 3.4.1)

CMake最小版本使用的是3.4.1。

add_library()

配置so库信息(为当前当前脚本文件添加库)

native-lib

这个是声明引用so库的名称,在项目中,如果需要使用这个so文件,引用的名称就是这个。值得注意的是,实际上生成的so文件名称是libnative-lib。

SHARED

这个参数表示共享so库文件,也就是在Run项目或者build项目时会在目录intermediates\transforms\mergeJniLibs\debug\folders\2000\1f\main下生成so文件。

src/main/cpp/native-lib.cpp构建so库的源文件。

find_library()

查找一个库文件

log-lib

这个指定的是在NDK库中每个类型的库会存放一个特定的位置,而log库存放在log-lib中

log

指定使用log库

target_link_libraries()如果你本地的库(native-lib)想要调用log库的方法,那么就需要配置这个属性,意思是把NDK库关联到本地库。

native-lib要被关联的库名称

${log-lib}要关联的库名称,要用大括号包裹,前面还要有$符号去引用。

JNIEXPORT jstring JNICALL
Java_com_glee_myapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

JNIEXPORT & JNICALL

JNIEXPORT和JNICALL这两个宏(被定义在jni.h)确保这个函数在本地库外可见,并且编译器会进行正确的调用转换。

函数规范

在JNI中C/C++的函数名是有规范要求的,由以下几部分串接而成

  • Java_ 前缀
  • 完全限定的类名,并用下划线 _ 作为分隔符
  • 第一参数 JNIEnv* env
  • 第二个参数 jobjectjclass
  • 其他参数按类型映射
  • 返回参数按类型映射

操作

编写 Native 方法

下面来写几个 Native 方法:

external fun getStr(): String
external fun getHelloJniStr(): String

生成头文件

右键MainActivity->External Tools->javah:

Android_JNI_Learn

然后就会帮我们生成:

Android_JNI_Learn

编写Cpp函数

#include<jni.h>
#include<string>

extern "C"
JNIEXPORT jstring JNICALL
Java_top_jowanxu_jnidemo_MainActivity_getStr(JNIEnv *env, jobject instance) {

    return env->NewStringUTF("Java_top_jowanxu_jnidemo_MainActivity_getStr");
}

extern "C"
JNIEXPORT jstring JNICALL
Java_top_jowanxu_jnidemo_MainActivity_getHelloJniStr(JNIEnv *env, jobject instance) {

    return env->NewStringUTF("Java_top_jowanxu_jnidemo_MainActivity_getHelloJniStr");
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

拆掉互联网那堵墙

拆掉互联网那堵墙

庄良基 / 经济日报出版社 / 2014-6 / 25.80

都在说道互联网、说道电子商务、说道移动APP、说道微信、说道互联网金融......我们该如何认识互联网?中小微企业该如何借力互联网?互联网很神秘吗?很高深莫测吗? 其实互联网并没有什么神秘的,也没有什么高深莫测的!互联网无非是人类发明的工具而已,既然是工具,我们就一定可以驾驭和使用它。既然可以双重使用,就理当让所有有人都容易掌握并轻松驾驭。 互联网离我们很远吗?互联网界的成功故事都是那......一起来看看 《拆掉互联网那堵墙》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器