国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android Java代碼與JNI交互 JNI方法Java類字段 (六)

這篇具有很好參考價值的文章主要介紹了Android Java代碼與JNI交互 JNI方法Java類字段 (六)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?? Android Studio 版本 ????

Android Java代碼與JNI交互 JNI方法Java類字段 (六),AndroidNDK,android,java,NDK,jni,native

??? Java 基礎(chǔ)類型數(shù)據(jù)對應(yīng) Native層的字母 ??

?通過 jni 查找java某個類中相應(yīng)字段對應(yīng)的數(shù)據(jù)類型 , 需要使用到 jni 中的 GetFieldID() 函數(shù)

jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)
    { return functions->GetFieldID(this, clazz, name, sig); }
* |Java    |JNI   |
* |boolean |Z     |
* |byte    |B     |
* |char    |C     |
* |short   |S     |
* |int     |I     |
* |long    |J     |
* |float   |F     |
* |double  |D     |

?? Java 引用類型數(shù)據(jù)對應(yīng) Native層字符串????

 * |Java       |JNI                  |
 * |String     |Ljava/lang/String;   |
 * |Class      |Ljava/lang/Class;    |
 * |Throwable  |Ljava/lang/Throwable;|
 * |int[]      |[I                   |
 * |Object[]   |[Ljava/lang/Object;  |

??? 創(chuàng)建 JNIAccessField 文件 ??

package com.cmake.ndk1.jni;

import com.cmake.ndk1.model.Animal;

public class JNIAccessField {
    static {
        System.loadLibrary("access-field-lib");
    }
    public static int num;
    public native void accessInstanceField(Animal animal);
}

?? 配置動態(tài)庫名稱 ???

add_library(
        #動態(tài)庫名稱 access-field-lib
        access-field-lib

        SHARED

        jni/jni_access_field.cpp
)

?? 生成可關(guān)聯(lián)的庫鏈接 ???

為了讓Java能夠調(diào)用 access-field-lib 庫中的函數(shù),您需要使用 CMake 構(gòu)建腳本中的?target_link_libraries()?命令來關(guān)聯(lián) access-field-lib

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

??? 提供給 Native層調(diào)用的日志庫鏈接 ??

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

??? Native層實現(xiàn) JNIAccessField 類的JNI的相關(guān)函數(shù)??

對Animal對象實例字段name的修改?

//對Animal對象實例字段name的修改
extern "C"
JNIEXPORT void JNICALL
Java_com_cmake_ndk1_jni_JNIAccessField_accessInstanceField(JNIEnv *env, jobject thiz,
                                                           jobject animal) {
    jclass cls = env->GetObjectClass(animal);

    //獲取參數(shù)對象參數(shù)名字name
    jfieldID fid = env->GetFieldID(cls, "name", "Ljava/lang/String;");
    //創(chuàng)建字符串用于對象中name字段的值
    jstring str = env->NewStringUTF("this is new name");
    //為Animal對象中name設(shè)置值
    env->SetObjectField(animal, fid, str);
}

?對Animal對象靜態(tài)字段num的修改

extern "C"
JNIEXPORT void JNICALL
Java_com_cmake_ndk1_jni_JNIAccessField_accessStaticField(JNIEnv *env, jobject thiz,
                                                         jobject animal) {

    jclass cls = env->GetObjectClass(animal);

    //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID
    jfieldID fid = env->GetStaticFieldID(cls, "num", "I");
    //獲取num的值
    int num = env->GetStaticIntField(cls, fid);
    //修改num的值(++num)
    env->SetStaticIntField(cls, fid, ++num);
}

此函數(shù)不會獲取jclass,進(jìn)而操作 num 的值

// 此函數(shù)不會獲取jclass,進(jìn)而操作 num 的值
extern "C"
JNIEXPORT void JNICALL
Java_com_cmake_ndk1_jni_JNIAccessField_staticAccessInstanceField(JNIEnv *env, jclass clazz) {

    //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID
    jfieldID fid = env->GetStaticFieldID(clazz, "num", "I");
    //獲取num的值
    int num = env->GetStaticIntField(clazz, fid);
    //修改num的值(++num)
    env->SetStaticIntField(clazz, fid, ++num);

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

/**
 * |Java    |JNI   |
 * |boolean |Z     |
 * |byte    |B     |
 * |char    |C     |
 * |short   |S     |
 * |int     |I     |
 * |long    |J     |
 * |float   |F     |
 * |double  |D     |
 */

/**
 * |Java       |JNI                  |
 * |String     |Ljava/lang/String;   |
 * |Class      |Ljava/lang/Class;    |
 * |Throwable  |Ljava/lang/Throwable;|
 * |int[]      |[I                   |
 * |Object[]   |[Ljava/lang/Object;  |
 */

//對Animal對象實例字段name的修改
extern "C"
JNIEXPORT void JNICALL
Java_com_cmake_ndk1_jni_JNIAccessField_accessInstanceField(JNIEnv *env, jobject thiz,
                                                           jobject animal) {
    jclass cls = env->GetObjectClass(animal);

    //獲取參數(shù)對象參數(shù)名字name
    jfieldID fid = env->GetFieldID(cls, "name", "Ljava/lang/String;");
    //創(chuàng)建字符串用于對象中name字段的值
    jstring str = env->NewStringUTF("this is new name");
    //為Animal對象中name設(shè)置值
    env->SetObjectField(animal, fid, str);
}

//對Animal對象靜態(tài)字段num的修改
extern "C"
JNIEXPORT void JNICALL
Java_com_cmake_ndk1_jni_JNIAccessField_accessStaticField(JNIEnv *env, jobject thiz,
                                                         jobject animal) {

    jclass cls = env->GetObjectClass(animal);

    //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID
    jfieldID fid = env->GetStaticFieldID(cls, "num", "I");
    //獲取num的值
    int num = env->GetStaticIntField(cls, fid);
    //修改num的值(++num)
    env->SetStaticIntField(cls, fid, ++num);
}

// 此函數(shù)不會獲取jclass,進(jìn)而操作 num 的值
extern "C"
JNIEXPORT void JNICALL
Java_com_cmake_ndk1_jni_JNIAccessField_staticAccessInstanceField(JNIEnv *env, jclass clazz) {

    //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID
    jfieldID fid = env->GetStaticFieldID(clazz, "num", "I");
    //獲取num的值
    int num = env->GetStaticIntField(clazz, fid);
    //修改num的值(++num)
    env->SetStaticIntField(clazz, fid, ++num);

}

??? 調(diào)用Native層相關(guān)函數(shù)操作Animal ??

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.JNIAccessField;
import com.cmake.ndk1.jni.JNIReferenceType;
import com.cmake.ndk1.model.Animal;

public class MainActivity6 extends AppCompatActivity {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        JNIAccessField jniAccessField=new JNIAccessField();
        Animal animal=new Animal("animal");

        final TextView textView=findViewById(R.id.sample_text);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                jniAccessField.accessInstanceField(animal);
                jniAccessField.accessStaticField(animal);
                JNIAccessField.staticAccessInstanceField();
                Log.i("MainActivity6","name is "+animal.getName());
                Log.i("MainActivity6","num is "+Animal.num);
                Log.i("MainActivity6","num is "+JNIAccessField.num);
            }
        });
    }
}

運(yùn)行結(jié)果 :??

D/Animal: call getName method
I/MainActivity6: name is this is new name
I/MainActivity6: num is 1
I/MainActivity6: num is 1
D/Animal: call getName method
I/MainActivity6: name is this is new name
I/MainActivity6: num is 2
I/MainActivity6: num is 2
D/Animal: call getName method
I/MainActivity6: name is this is new name
I/MainActivity6: num is 3
I/MainActivity6: num is 3

?下載案例文章來源地址http://www.zghlxwxcb.cn/news/detail-569195.html

到了這里,關(guān)于Android Java代碼與JNI交互 JNI方法Java類字段 (六)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android Java代碼與JNI交互字符串轉(zhuǎn)換(四)

    Android Java代碼與JNI交互字符串轉(zhuǎn)換(四)

    ?? Android Studio 版本 ??? ?? 創(chuàng)建JNIString.java ?? ??? Native層實現(xiàn) JNI的callNativeString函數(shù) ?? ?? 配置動態(tài)庫名稱 ??? 編輯CMakeLists.txt 根據(jù)j ni/jni_string.cpp 配置動態(tài)庫名稱 ??? 生成可關(guān)聯(lián)的庫鏈接 ?? 為了讓Java能夠調(diào)用?string-lib庫中的函數(shù),您需要使用 CMake 構(gòu)建腳本中的?

    2024年02月13日
    瀏覽(24)
  • Android Java代碼與JNI交互基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換(三)

    Android Java代碼與JNI交互基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換(三)

    ?? Android Studio 版本 ??? ?? 基礎(chǔ)類型數(shù)據(jù)的轉(zhuǎn)換 ?? 定義傳遞基礎(chǔ)數(shù)據(jù)類型到Native的JNI接口函數(shù) Native層創(chuàng)建callNativeInt 提供給Java調(diào)用 CMakeLists.txt 文件下配置動態(tài)庫名稱 ?添加 target_link_libraries 配置 Java調(diào)用Native層函數(shù)? ?運(yùn)行打印日志 Java調(diào)用Native分別打印基礎(chǔ)類型數(shù)據(jù) ?下

    2024年02月13日
    瀏覽(26)
  • Android Studio 進(jìn)行NDK開發(fā),實現(xiàn)JNI,以及編寫C++與Java交互(Java調(diào)用本地函數(shù))并編譯出本地so動態(tài)庫

    Android Studio 進(jìn)行NDK開發(fā),實現(xiàn)JNI,以及編寫C++與Java交互(Java調(diào)用本地函數(shù))并編譯出本地so動態(tài)庫

    1.首先認(rèn)識一下NDK。 (1)什么是NDK? NDK全稱是Native Development Kit,NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C/C++的動態(tài)庫,并能自動將so和java應(yīng)用一起打包成apk。NDK集成了交叉編譯器(交叉編譯器需要UNIX或LINUX系統(tǒng)環(huán)境),并提供了相應(yīng)的mk文件隔離CPU、平臺、ABI等差異,

    2024年02月11日
    瀏覽(35)
  • Android JNI復(fù)雜用法,回調(diào),C++中調(diào)用Java方法

    Android JNI的 普通用法估計很多人都會,但是C++中調(diào)用Java方法很多人不熟悉,并且網(wǎng)上很多介紹都是片段的。 雖然C/C++調(diào)用Java不常用,但是掌握多一點還是有好處的。 Android JNI的基礎(chǔ)知識介紹,之前已經(jīng)有介紹,不熟悉的可以先看看: Android Jni的介紹和簡單Demo實現(xiàn): https://

    2024年03月26日
    瀏覽(26)
  • Android和JNI交互 : 常見的圖像格式轉(zhuǎn)換 : NV21、RGBA、Bitmap等

    Android和JNI交互 : 常見的圖像格式轉(zhuǎn)換 : NV21、RGBA、Bitmap等

    最近在使用 OpenCV 處理圖片的時候,經(jīng)常會遇到需要轉(zhuǎn)換圖像的情況,網(wǎng)上相關(guān)資料比較少,也不全,有時候得費(fèi)勁老半天才能搞定。 自己踩了坑后,在這里記錄下,都是我在項目中遇到的圖像轉(zhuǎn)化操作,是一些常用的圖像格式轉(zhuǎn)換操作。 具體包括: nv21、rgba、rgb 轉(zhuǎn)換 OpenC

    2024年02月05日
    瀏覽(28)
  • Android JNI和原生交互,常見的圖像格式轉(zhuǎn)換 : NV21、RGBA、Bitmap等

    Android JNI和原生交互,常見的圖像格式轉(zhuǎn)換 : NV21、RGBA、Bitmap等

    最近在使用 OpenCV 處理圖片的時候,經(jīng)常會遇到需要轉(zhuǎn)換圖像的情況,網(wǎng)上相關(guān)資料比較少,也不全,有時候得費(fèi)勁老半天才能搞定。 自己踩了坑后,在這里記錄下,都是我在項目中遇到的圖像轉(zhuǎn)化操作,是一些常用的圖像格式轉(zhuǎn)換操作。 具體包括: nv21、rgba、rgb 轉(zhuǎn)換 OpenC

    2024年02月06日
    瀏覽(24)
  • Android:JNI實戰(zhàn),理論詳解、Java與Jni數(shù)據(jù)調(diào)用

    Android:JNI實戰(zhàn),理論詳解、Java與Jni數(shù)據(jù)調(diào)用

    上一篇博文《Android:JNI實戰(zhàn),加載三方庫、編譯C/C++》講解了如何搭建一個可以加載和鏈接第三方庫、編譯 C/C++ 文件的 Jni Demo?App。 這篇博文在這個 Jni Demo App 的基礎(chǔ)上,從實戰(zhàn)出發(fā)詳細(xì)講解? Jni? 開發(fā)語法。 接下來,先用一小節(jié)將 Jni 開發(fā)比較重要的理論知識點過一下,然

    2024年01月23日
    瀏覽(25)
  • Android基于JNI的Java與C++互調(diào)

    java調(diào)用C++: //導(dǎo)出c函數(shù)格式 extern \\\"C\\\" JNIEXPORT //供JNI調(diào)用? JNICALL 函數(shù)名格式 Java_包名_類名_函數(shù)名(包名.替換為_) Java_com_example_getapplist_MainActivity_stringFromJNI ? ?包名:com_example_getapplist? ?類名:MainActivity.? ? ? 函數(shù)名:stringFromJNI C++ Jni? CMakeList.txt??

    2024年02月10日
    瀏覽(20)
  • Android studio配置OpenCV的JNI接口,實現(xiàn)C++代碼編程

    Android studio配置OpenCV的JNI接口,實現(xiàn)C++代碼編程

    目錄 一、下載OpenCV-android-sdk 二、新建項目 三、導(dǎo)入OpenCV包 ?四、配置OpenCV的JNI接口,拷貝OpenCV所需的頭文件和庫文件 五、修改Cmake文件 ?六、配置app的build.gradle文件 ?七、測試 OpenCV官網(wǎng)地址:https://opencv.org/? 點擊Library--Releases,下載Android版本,解壓得到?OpenCV-android-sdk文件

    2024年02月10日
    瀏覽(24)
  • Android藍(lán)牙使能流程圖(Android Bluetooth enable) -- java & jni層

    Android藍(lán)牙使能流程圖(Android Bluetooth enable) -- java & jni層

    在介紹Android enable流程之前,我們首先來看下Android的流程圖 以上圖示是android8以上的,主要跟Android8之前的架構(gòu)在于Bluetooth stack跟vendor層之間增加一層HIDL,主要是抽象硬件層的作用 OK,回歸主題,我們來看下Android的enable流程,首先上一張架構(gòu)圖 另外聲明下:我們做了一些列

    2024年02月09日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包