亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

怎么創建一個動態注冊項目?

怎么創建一個動態注冊項目?

正在回答

1 回答

JNIDynamicLoad.java
public?class?JNIDynamicLoad?{
????static?{
????????System.loadLibrary("dynamic-lib");
????}

????public?native?int?getRandomNum();

????public?native?String?getNativeString();
}


jni_dynamic_load.cpp

//
//?Created?by?admin?on?2020-04-27.
//

#include?<jni.h>
#include?<cassert>
#include?<cstdlib>
#include?<iostream>

using?namespace?std;

jint?get_random_num(JNIEnv?*env)?{
????return?rand();
}

jstring?get_native_string(JNIEnv?*env)?{
????return?env->NewStringUTF("jni動態加載的字符串,嘿嘿嘿");
}

/**
?*?需要注冊的函數列表,放在JNINativeMethod類型的數組中,以后如果需要增加函數,只需在這里添加就行了
?*?參數:
?*?1、java代碼中用native關鍵字聲明的函數名字符串
?*?2、簽名(傳進來參數類型和返回值類型的說明)
?*?3、C/C++中對應函數的函數名(地址)
?*/
static?JNINativeMethod?getMethods[]?=?{
????????{"getRandomNum",????"()I",??????????????????(void?*)?get_random_num},
????????{"getNativeString",?"()Ljava/lang/String;",?(void?*)?get_native_string}
};

/**
?*?此函數通過調用JNI中?RegisterNatives?方法來注冊我們的函數
?*?@param?env
?*?@param?className
?*?@param?methods
?*?@param?nMethods
?*?@return
?*/
static?int?registerNativeMethods(JNIEnv?*env,?const?char?*className,?const?JNINativeMethod?*methods,
?????????????????????????????????jint?nMethods)?{
????jclass?clazz;
????//找到聲明native方法的類
????clazz?=?env->FindClass(className);
????if?(clazz?==?NULL)?{
????????return?JNI_FALSE;
????}
????if?(env->RegisterNatives(clazz,?methods,?nMethods)?<?0)?{
????????return?JNI_FALSE;
????}
????return?JNI_TRUE;
}

static?int?registerNatives(JNIEnv?*env)?{
????const?char?*className?=?"com/example/jnidemo3/load/JNIDynamicLoad";
????return?registerNativeMethods(env,?className,?getMethods,
?????????????????????????????????sizeof(getMethods)?/?sizeof(getMethods[0]));
}

JNIEXPORT?jint?JNICALL?JNI_OnLoad(JavaVM?*vm,?void?*reserved)?{
????JNIEnv?*env?=?NULL;
????//判斷虛擬機狀態是否有問題
????if?(vm->GetEnv((void?**)?&env,?JNI_VERSION_1_6)?!=?JNI_OK)?{
????????return?-1;
????}
????assert(env?!=?NULL);
????if?(!registerNatives(env))?{
????????return?-1;
????}
????return?JNI_VERSION_1_6;
}

CMakeList.txt

add_library(
????????dynamic-lib
????????SHARED
????????jni/jni_dynamic_load.cpp
)

target_link_libraries(
????????dynamic-lib
????????${log-lib})

如果還有疑惑,可以看我練習的代碼
https://github.com/shuiyouwen/JniDemo3

2 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

怎么創建一個動態注冊項目?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號