C語言JNI的動態(tài)注冊詳解_第1頁
C語言JNI的動態(tài)注冊詳解_第2頁
C語言JNI的動態(tài)注冊詳解_第3頁
C語言JNI的動態(tài)注冊詳解_第4頁
C語言JNI的動態(tài)注冊詳解_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C語言JNI的動態(tài)注冊詳解目錄總結(jié)JNI的靜態(tài)注冊就是Javah生成頭文件,本章第一篇已經(jīng)講過,現(xiàn)在我們來講講第二種方式,JNI動態(tài)注冊。首先是module的build.gradle:

android{

compileSdkVersion30

buildToolsVersion"30.0.3"

defaultConfig{

applicationId"com.jhzl.a7_jni_2way"

minSdkVersion21

targetSdkVersion30

versionCode1

versionName"1.0"

testInstrumentationRunner"androidx.test.runner.AndroidJUnitRunner"

externalNativeBuild{

cmake{

cppFlags""

buildTypes{

release{

minifyEnabledfalse

proguardFilesgetDefaultProguardFile('proguard-android-optimize.txt'),''

externalNativeBuild{

cmake{

path"CMakeLists.txt"

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

publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextViewaddTv=findViewById(R.id.add_tv);

TextViewsubTv=findViewById(R.id.sub_tv);

addTv.setText("加法計算:"+add(10,20));

subTv.setText("減法計算:"+sub(10,20));

static{

//加載靜態(tài)庫

System.loadLibrary("native-lib");

publicnativeintadd(inta,intb);

publicnativeintsub(inta,intb);

接著就是CMakeLists.txt

#指定cmke版本

cmake_minimum_required(VERSION3.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:

#ifndefPRACTICLE_HELLO_H

#definePRACTICLE_HELLO_H

extern"C"

#endif//PRACTICLE_HELLO_H

Hello.cpp:

#includejni.h

#include"Hello.h"

#includeandroid/log.h

#defineTAG"helloworld-jni"http://這個是自定義的LOG的標(biāo)識

#defineLOGD(...)__android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)//定義LOGD類型

#defineLOGI(...)__android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)//定義LOGI類型

#defineLOGW(...)__android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__)//定義LOGW類型

#defineLOGE(...)__android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)//定義LOGE類型

#defineLOGF(...)__android_log_print(ANDROID_LOG_FATAL,TAG,__VA_ARGS__)//定義LOGF類型

#ifdef__cplusplus

extern"C"{

#endif

//對應(yīng)MainActivity的add

jintadd(JNIEnv*env,jobjectclazz,jinta,jintb){

returna+b;

//對應(yīng)MainActivity的sub

jintsub(JNIEnv*env,jobjectclazz,jinta,jintb){

returna-b;

//回調(diào)函數(shù)在這里面注冊函數(shù)

jintJNI_OnLoad(JavaVM*vm,void*reserved){

JNIEnv*env=NULL;

//env賦值

LOGD("GetEnv");

//獲取JniEnv

if(vm-GetEnv((void**)env,JNI_VERSION_1_6)!=JNI_OK){

LOGD("GetEnvFailed");

return-1;

//獲取一個class對象,對應(yīng)java類MainActivity

jclassmainActivity=env-FindClass("com/jhzl/a7_jni_2way/MainActivity");

*add:java方法名

*(II)I里面是兩個jint,返回jnit

*add,c函數(shù)指針,傳遞的參數(shù)應(yīng)該是env,jobject,包括簽名的(II)兩個jint,一個jnit返回值

JNINativeMethodmethods_MainActivity[]={

{"add","(II)I",(jint*)add},

{"sub","(II)I",(jint*)sub}

env-RegisterNatives(mainActivity,methods_MainActivity,sizeof(methods_MainActivity)/sizeof(methods_MainActivity[0]));

env

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論