Android Java代码与JNI交互 引用类型转换(五)

这篇具有很好参考价值的文章主要介绍了Android Java代码与JNI交互 引用类型转换(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🔥 Android Studio 版本 🔥 

Android Java代码与JNI交互 引用类型转换(五),AndroidNDK,jni,ndk,java,c

 🔥 Java中基础数据类型对应Native的数据类型 🔥

 * Java中基础数据类型对应Native中的数据类型
 * |Java    |Native   |
 * |boolean |jboolean |
 * |byte    |jbyte    |
 * |short   |jshort   |
 * |int     |jint     |
 * |long    |jlong    |
 * |float   |jfloat   |
 * |double  |jdouble  |

🔥 Java中引用数据类型 对应Native中的数据类型 🔥 

 * Java中引用数据类型 对应Native中的数据类型
 * |Java Reference       |Native        |Java Reference  |Native      |
 * |All objects          |jobject       |char[]          |jcharArray  |
 * |java.lang.Class      |jclass        |short[]         |jshortArray |
 * |java.lang.String     |jstring       |int[]           |jintArray   |
 * |Object[]             |jobjectArray  |long[]          |jlongArray  |
 * |boolean[]            |jbooleanArray |float[]         |jfloatArray |
 * |byte[]               |jbyteArray    |double[]        |doubleArray |
 * |java.lang.Throwable  |jthrowable

 🔥 创建  JNIReferenceType 🔥

package com.cmake.ndk1.jni;

public class JNIReferenceType {
    static {
        System.loadLibrary("reference-type-lib");
    }
    public native String callNativeStringArray(String[] strArray);
}

🔥 生成可关联的库链接 🔥

为了让Java能够调用reference-type-lib库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联reference-type-lib 库


target_link_libraries( # Specifies the target library.
        ndk1
        person-lib
        dynamic-lib
        basic-type-lib
        string-lib
        reference-type-lib
        # Links the target library to the log library
        # included in the NDK. )
        )

 🔥 提供给 Natvie层 调用的日志库链接 🔥

target_link_libraries( # Specifies the target library.
        reference-type-lib
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

 🔥 Native层 实现 callNativeStringArray 函数 🔥

#include <base.h>
#include <string>
#include <jvm.h>

/**
 * Java中基础数据类型对应Native中的数据类型
 * |Java    |Native   |
 * |boolean |jboolean |
 * |byte    |jbyte    |
 * |short   |jshort   |
 * |int     |jint     |
 * |long    |jlong    |
 * |float   |jfloat   |
 * |double  |jdouble  |
 */

/**
 * Java中引用数据类型 对应Native中的数据类型
 * |Java Reference       |Native        |Java Reference  |Native      |
 * |All objects          |jobject       |char[]          |jcharArray  |
 * |java.lang.Class      |jclass        |short[]         |jshortArray |
 * |java.lang.String     |jstring       |int[]           |jintArray   |
 * |Object[]             |jobjectArray  |long[]          |jlongArray  |
 * |boolean[]            |jbooleanArray |float[]         |jfloatArray |
 * |byte[]               |jbyteArray    |double[]        |doubleArray |
 * |java.lang.Throwable  |jthrowable
 */

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_cmake_ndk1_jni_JNIReferenceType_callNativeStringArray(JNIEnv *env, jobject thiz,
                                                               jobjectArray str_array) {
    //获取数组长度
    int len = env->GetArrayLength(str_array);

    //打印长度
    LOGD("len is %d", len);

    //获取对象数组的某一个元素(首元素)
    //获取其他数组类型的某一个元素可以使用类似的方式
    jstring jStringValue = static_cast<jstring>(env->GetObjectArrayElement(str_array, 0));

    //  打印jStringValue需要通过 GetStringUTFChars 转换,再打印
    const char *str = env->GetStringUTFChars(jStringValue, 0);
    LOGD("string value is %s", str);

    //释放掉jStringValue的内存空间
    env->ReleaseStringUTFChars(jStringValue,str);

    //将str返回给应用层
    return env->NewStringUTF(str);
}

🔥 调用Native层相关函数 🔥 

package com.cmake.ndk1;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.cmake.ndk1.jni.JNIReferenceType;
import com.cmake.ndk1.jni.JNIString;

public class MainActivity5 extends AppCompatActivity {

    private String[] stringArrays={"字符串1","字符串2","字符串3"};
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JNIReferenceType referenceType=new JNIReferenceType();
        final TextView textView=findViewById(R.id.sample_text);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String str=referenceType.callNativeStringArray(stringArrays);
                Log.d("MainActivity5",String.valueOf(str));
            }
        });
    }
}

运行结果 : 

D/LOG_JNI: len is 3
D/LOG_JNI: string value is 字符串1
D/MainActivity5: 字符串1

 下载案例文章来源地址https://www.toymoban.com/news/detail-549731.html

到了这里,关于Android Java代码与JNI交互 引用类型转换(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Android Java代码与JNI交互 JNI方法Java类字段 (六)

    Android Java代码与JNI交互 JNI方法Java类字段 (六)

    🔥 Android Studio 版本 🔥    🔥 Java 基础类型数据对应 Native层的字母 🔥  通过 jni 查找java某个类中相应字段对应的数据类型 , 需要使用到 jni 中的 GetFieldID() 函数 🔥 Java 引用类型数据对应 Native层字符串 🔥   🔥 创建 JNIAccessField 文件 🔥 🔥 配置动态库名称 🔥  🔥 生成

    2024年02月16日
    浏览(8)
  • Android Java代码与JNI交互 JNI子线程访问Java方法 (八)

    Android Java代码与JNI交互 JNI子线程访问Java方法 (八)

    🔥 Android Studio 版本 🔥   🔥 创建包含JNI相关函数类 JNIInvokeMethod.java 🔥  🔥 配置动态库名称 🔥  🔥 生成可关联的库链接 🔥  为了让Java能够调用 invoke-method-lib 库中的函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令来关联 invoke-method-lib 库  🔥 提供给N

    2024年02月16日
    浏览(8)
  • Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等

    Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等

    最近在使用 OpenCV 处理图片的时候,经常会遇到需要转换图像的情况,网上相关资料比较少,也不全,有时候得费劲老半天才能搞定。 自己踩了坑后,在这里记录下,都是我在项目中遇到的图像转化操作,是一些常用的图像格式转换操作。 具体包括: nv21、rgba、rgb 转换 OpenC

    2024年02月05日
    浏览(11)
  • Android JNI和原生交互,常见的图像格式转换 : NV21、RGBA、Bitmap等

    Android JNI和原生交互,常见的图像格式转换 : NV21、RGBA、Bitmap等

    最近在使用 OpenCV 处理图片的时候,经常会遇到需要转换图像的情况,网上相关资料比较少,也不全,有时候得费劲老半天才能搞定。 自己踩了坑后,在这里记录下,都是我在项目中遇到的图像转化操作,是一些常用的图像格式转换操作。 具体包括: nv21、rgba、rgb 转换 OpenC

    2024年02月06日
    浏览(9)
  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库

    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,

    2024年02月11日
    浏览(12)
  • 【GiraKoo】Java Native Interface(JNI)的空间(引用)管理

    Java是通过垃圾回收机制回收内存,C/C++是通过malloc,free,new,delete手动管理空间。那么在JNI层,同时存在Java和C/C++的空间时,该如何进行空间的管理呢?本文参考Oracle的官方文档,对JNI层中空间的管理进行说明。明确哪些内容需要手动调用Delete,哪些不需要手动调用。 全局

    2024年02月05日
    浏览(8)
  • Android:JNI实战,理论详解、Java与Jni数据调用

    Android:JNI实战,理论详解、Java与Jni数据调用

    上一篇博文《Android:JNI实战,加载三方库、编译C/C++》讲解了如何搭建一个可以加载和链接第三方库、编译 C/C++ 文件的 Jni Demo App。 这篇博文在这个 Jni Demo App 的基础上,从实战出发详细讲解  Jni  开发语法。 接下来,先用一小节将 Jni 开发比较重要的理论知识点过一下,然

    2024年01月23日
    浏览(8)
  • 前端和后端交互数据类型转换

    前端和后端交互数据类型转换

    页面是男/女 后端pojo类以及数据库中是Integer 0/1  怎么样很方便地转化? ----枚举转化-- 在web开发中有时会使用枚举作为参数,而前端在调接口时就会出现传错或者传空导致后端拿不到枚举类型。在这里就使用反序列化@JsonDeserialize 这里是对枚举进行反序列化,所以首先编写一个

    2024年03月26日
    浏览(6)
  • Android studio配置OpenCV的JNI接口,实现C++代码编程

    Android studio配置OpenCV的JNI接口,实现C++代码编程

    目录 一、下载OpenCV-android-sdk 二、新建项目 三、导入OpenCV包  四、配置OpenCV的JNI接口,拷贝OpenCV所需的头文件和库文件 五、修改Cmake文件  六、配置app的build.gradle文件  七、测试 OpenCV官网地址:https://opencv.org/  点击Library--Releases,下载Android版本,解压得到 OpenCV-android-sdk文件

    2024年02月10日
    浏览(15)
  • Android基于JNI的Java与C++互调

    java调用C++: //导出c函数格式 extern \\\"C\\\" JNIEXPORT //供JNI调用  JNICALL 函数名格式 Java_包名_类名_函数名(包名.替换为_) Java_com_example_getapplist_MainActivity_stringFromJNI    包名:com_example_getapplist   类名:MainActivity.      函数名:stringFromJNI C++ Jni  CMakeList.txt  

    2024年02月10日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包