android jni示例,示例:hello-jni

本示例将引导您开发一个使用 NDK 构建的超小 C/C++ 应用 hello-jni。本示例位于 NDK 示例代码库的 hello-jni 目录下的 android-mk 分支中。

Android.mk

以下两行代码会提供原生源文件的名称,以及要构建的共享库的名称。当构建系统添加 lib 前缀和 .so 扩展名后,该构建库的全名将为 libhello-jni.so。

LOCAL_SRC_FILES := hello-jni.c

LOCAL_MODULE := hello-jni

如需详细了解 Android.mk 文件的用途和用法,请参阅 Android.mk。

Application.mk

这行代码的作用是告诉构建系统要针对哪些 CPU 和架构进行构建。在此示例中,构建系统会针对所有支持的架构进行构建。

APP_ABI := all

如需详细了解 Application.mk 文件及其用法,请参阅 Application.mk。

Java 端实现

helloJNI.java 文件位于 hellojni/src/com/example/hellojni/ 中。它会调用一个函数,以从原生端提取字符串,然后在屏幕上显示这个字符串。

源代码中包含 NDK 用户应特别注意的三行代码。本文会按调用顺序(而非代码编写顺序)展示这三行代码。

应用启动后,此函数调用便会加载 .so 文件。

Kotlin

System.loadLibrary("hello-jni")Java

System.loadLibrary("hello-jni");

在此方法声明中,使用 native 关键字的作用是告知虚拟机,函数位于共享库中(即在原生端实现)。

Kotlin

external fun stringFromJNI(): StringJava

public native String stringFromJNI();

Android 框架会调用在前面步骤中加载和声明的函数,从而在屏幕上显示字符串。

Kotlin

tv.text = stringFromJNI()Java

tv.setText( stringFromJNI() );

C 端实现

hello-jni.c 文件位于 hello-jni/jni/ 中。其中包含的函数能够返回 Java 端请求的字符串。此函数声明如下:

JNIEXPORT jstring JNICALL

Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,

jobject thiz )

此声明与 Java 源代码中声明的原生函数相对应。返回类型 jstring 是在 Java 原生接口规格中定义的数据类型。它是指向 Java 字符串的指针,并非真正的字符串。

返回 jstring 后,接下来是根据 Java 函数名和该函数名所在文件的路径返回的函数名。根据以下规则构建该函数名:

将 Java_ 附加到它开头。

描述与顶级源目录相关的文件路径。

使用下划线代替正斜线。

删掉 .java 文件扩展名。

在最后一个下划线后,附加函数名。

按照这些规则,此示例使用的函数名为 Java_com_example_hellojni_HelloJni_stringFromJNI。此名称指的是 hellojni/src/com/example/hellojni/HelloJni.java 中一个名为 stringFromJNI() 的 Java 函数。

JNIEnv* 是指向虚拟机的指针,jobject 是指向从 Java 端传递的隐式 this 对象的指针。

以下代码行会调用虚拟机 API (*env) 并向其传递返回值(即 Java 端函数请求的字符串)。

return (*env)->NewStringUTF(env, "Hello from JNI !

Compiled with ABI " ABI ".");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值