一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言JNI的動態注冊詳解

C語言JNI的動態注冊詳解

2021-12-20 15:25怪叔叔蘿莉控 C/C++

這篇文章主要介紹了JAVA JNI的動態注冊,這里提供簡單實例代碼,需要的朋友可以參考下,小編覺得寫的還不錯,希望能給你帶來幫助

JNI的靜態注冊就是Javah生成頭文件,本章第一篇已經講過,現在我們來講講第二種方式,JNI動態注冊。首先是module的build.gradle:

android {
  compileSdkVersion 30
  buildToolsVersion "30.0.3"

  defaultConfig {
      applicationId "com.jhzl.a7_jni_2way"
      minSdkVersion 21
      targetSdkVersion 30
      versionCode 1
      versionName "1.0"

      testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

      externalNativeBuild {
          cmake {
              cppFlags ""
          }
      }
  }
  buildTypes {
      release {
          minifyEnabled false
          proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      }
  }
  externalNativeBuild {
      cmake {
          path "CMakeLists.txt"
      }
  }
}

那我們的Activity的本地方法貼出來把:

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      TextView addTv = findViewById(R.id.add_tv);
      TextView subTv = findViewById(R.id.sub_tv);
      addTv.setText("加法計算:"+add(10,20));
      subTv.setText("減法計算:"+sub(10,20));
  }
  static {
      //加載靜態庫
      System.loadLibrary("native-lib");
  }

  public native int add(int a,int b);
  public native  int sub(int a,int b);

}

接著就是CMakeLists.txt

# 指定cmke版本
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib
      SHARED
      src/main/cpp/Hello.cpp) #添加.c源文件
include_directories(src/main/cpp/include) #添加頭文件的位置
target_link_libraries(native-lib
      log) #選擇要使用的庫

最后,我們貼出今天的重頭戲Hello.h:

#ifndef PRACTICLE_HELLO_H
#define PRACTICLE_HELLO_H
extern "C"
#endif //PRACTICLE_HELLO_H

Hello.cpp:

#include <jni.h>
#include "Hello.h"
#include<android/log.h>
#define TAG "helloworld-jni" // 這個是自定義的LOG的標識
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定義LOGD類型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定義LOGI類型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定義LOGW類型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定義LOGE類型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定義LOGF類型
#ifdef __cplusplus
extern "C" {
#endif

//對應MainActivity的add
jint add(JNIEnv *env, jobject clazz, jint a, jint b) {
  return a + b;
}

//對應MainActivity的sub
jint sub(JNIEnv *env, jobject clazz, jint a, jint b) {
  return a - b;
}

//回調函數 在這里面注冊函數
jint  JNI_OnLoad(JavaVM* vm, void* reserved){
  JNIEnv* env = NULL;
  //env賦值
  LOGD("GetEnv");
  //獲取JniEnv
  if(vm->GetEnv((void**)&env,JNI_VERSION_1_6)!= JNI_OK){
      LOGD("GetEnv Failed");
      return -1;
  }
  //獲取一個class對象,對應java類MainActivity
  jclass  mainActivity = env->FindClass("com/jhzl/a7_jni_2way/MainActivity");

  /**
   * add : java方法名
   * (II)I 里面是兩個jint,返回jnit
   * add,c函數指針,傳遞的參數應該是env,jobject,包括簽名的(II)兩個jint,一個jnit返回值
   *
   */
  JNINativeMethod methods_MainActivity[] = {
          {"add", "(II)I", (jint *) add},
          {"sub", "(II)I", (jint *) sub}

  };
  env->RegisterNatives(mainActivity,methods_MainActivity,sizeof(methods_MainActivity)/ sizeof(methods_MainActivity[0]));
  env->RegisterNatives(mainActivity,methods_MainActivity,sizeof(methods_MainActivity)/ sizeof(methods_MainActivity[1]));
  //返回jni 的版本
  return JNI_VERSION_1_6;
}


#ifdef __cplusplus
}
#endif

最后運行的效果是:

C語言JNI的動態注冊詳解

jni參數對照表:

C語言JNI的動態注冊詳解

 

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/eava_wu/article/details/119360970

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 国产主播99 | 波多野结衣在线中文字幕 | 草莓视频幸福宝 | 成人毛片高清视频观看 | 草草视频免费在线观看 | 美女毛片老太婆bbb80岁 | 538免费精品视频搬运工 | www国产精品| 天使萌痴汉在线中文字幕 | 色综合天天娱乐综合网 | 免费观看在线观看 | 女人被男人躁得好爽免费视频 | 女张腿男人桶羞羞漫画 | 無码一区中文字幕少妇熟女网站 | 亚洲福利在线观看 | 亚洲人成网站在线观看90影院 | 亚洲国产欧美在线看片 | 草莓视频在线观看免费 | 欧美日韩国产成人综合在线 | 久久伊人影视 | 日本高清在线播放一区二区三区 | 精品国产自在在线在线观看 | 久久亚洲午夜牛牛影视 | 小舞丝袜调教喷水沦为肉奴 | 8x8x极品国产在线 | 国产精品酒店视频免费看 | 好男人在线观看免费高清2019韩剧 | 水多多www视频在线观看高清 | 天天视频国产精品 | 明星ai人脸替换造梦在线播放 | 99精品视频在线观看 | 小莹的性荡生活45章 | 九九热在线视频 | 亚洲成人免费看 | 四虎影视在线看 | 极品 女神校花 露脸91 | 波多野结衣中文丝袜字幕 | 三级黄片毛片 | 亚欧国产| 国产理论片在线观看 | 国产人成77777视频网站 |