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

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

查看所有标签

猜你喜欢:

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

ActionScript 3.0 Cookbook

ActionScript 3.0 Cookbook

Joey Lott、Darron Schall、Keith Peters / Adobe Dev Library / 2006-10-11 / GBP 28.50

Well before Ajax and Microsoft's Windows Presentation Foundation hit the scene, Macromedia offered the first method for building web pages with the responsiveness and functionality of desktop programs......一起来看看 《ActionScript 3.0 Cookbook》 这本书的介绍吧!

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

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试