C語言JNI的動態註冊詳解

2023-03-18 23:40:37 字數 2329 閱讀 3927

目錄

jni的靜態註冊就是j**ah生成標頭檔案,本章第一篇已經講過,現在我們來講講第二種方式,jni動態註冊。首先是module的build.gradle:

android }}

buildtypes

}externalnativebuild }}

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

public class mainactivity extends appcompatactivity

static

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/ #新增標頭檔案的位置

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

#include "hello.h"

#include

#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"

//對應mainactivity的sub

jint sub(jnienv *env, jobject clazz, jint a, jint b)

//**函式 在這裡面註冊函式

jint jni_onload(j****m* vm, void* reserved)

//獲取一個class物件,對應j**a類mainactivity

jclass mainactivity = env->findclass("com/jhzl/a7_jni_2way/mainactivity");

/*** add : j**a方法名

* (ii)i 裡面是兩個jint,返回jnit

* add,c函式指標,傳遞的引數應該是env,jobject,包括簽名的(ii)兩個jint,一個jnit返回值**/

jninativemethod methods_mainactivity = ,

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

最後執行的效果是:

jni引數對照表:

本文標題: c語言jni的動態註冊詳解

本文地址: /ruanjian/c/417768.html

JNI原理與靜態 動態註冊

前言 jni不僅僅在ndk開發中應用,它更是android系統中j a與native互動的橋樑,不理解jni的話,你就只能停留在j a framework層。這一個系列我們來一起深入學習jni。android系統按語言來劃分的話由兩個世界組成,分別是j a世界和native世界。那為什麼要這麼劃分呢...

動態註冊和靜態註冊(2018 5 21)

1 四大元件只有廣播接收者可以不在清單檔案中註冊 2 靜態註冊 在清單檔案中通過宣告一個receiver節點指定intent filter,這種方式就是靜態註冊 3 動態註冊 registerreceiver receiver,filter 4 登出的方法 unregisterreceiver re...

C語言動態陣列詳解

目錄 程式設計客棧堆記憶體分配函式 說明void malloc int n 形參n為要求分配的位元組數。需要注意的是,malloc函式分配得到的記憶體空間是未初始化的。必須使用memset函式來初始化。calloc 10,swww.cppcns.comizeof char 兩個引數 單元數,單元的s...

監聽的動態註冊和靜態註冊

動態監聽 oracle例項在啟動時,或使用命令altersystemregister,或每隔一分鐘,pmon程序會向監聽進行動態註冊,pmon 程序根據 init.ora 中的instance name,service names 兩個引數將例項和服務動態註冊到 listener 中 oracle ...

C語言動態記憶體分配的詳解

c語言動態記憶體分配的詳解 1.為什麼使用動態記憶體分配 陣列在使用的時候可能造成記憶體浪費,使用動態記憶體分配可以解決這個問題。2.malloc和free c函式庫提供了兩個函式,malloc和free,分別用於執行動態記憶體分配和釋放。1 void malloc size t size mall...