Android_JNI_Learn

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

内容简介: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/Linuxndk-build,没有.cmd后缀
ProgramD:\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");
}

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

查看所有标签

猜你喜欢:

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

重来2

重来2

[美] 贾森·弗里德、[美] 戴维·海涅迈尔·汉森 / 苏西 / 中信出版社 / 2014-4-8 / 39.00元

“不再需要办公室”,这不仅仅是未来才有的事——它已经发生了。现在,轮到你迈开脚步,跟上时代的步伐了。 上百万的员工和成千上万的企业已经发现了远程工作的乐趣和好处。然而,远程工作方式还没有成为常见的选择。事实上,远程工作的技术手段都已齐备。还没有升级换代的,是人们的思想。 这本书的目的就是帮你把想法升级换代。作者会向你展示远程工作的诸多好处:可以找到最优秀的人才,从摧残灵魂的通勤路上解脱......一起来看看 《重来2》 这本书的介绍吧!

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

RGB HEX 互转工具

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

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具