目錄
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...