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");
}

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

查看所有标签

猜你喜欢:

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

Tagging

Tagging

Gene Smith / New Riders / 2007-12-27 / GBP 28.99

Tagging is fast becoming one of the primary ways people organize and manage digital information. Tagging complements traditional organizational tools like folders and search on users desktops as well ......一起来看看 《Tagging》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码