NDK動的登録
NDKについてはご存知のように
静的登録
これは最も基本的な
では、これは静的登録です.つまり、名前は組み合わせられていますが、ソースコードを見てみると、そうではないことがわかりました.実際には、静的登録の方法で登録されています.
動的登録
動的登録とは、メソッド名とメソッド名の形式で書く必要がなく、1つ書くだけでいいということです.始めましょう.動的登録はこの方法を実現する必要があります.
この方法をどのように理解するかというと、AactivityのonCreateという方法と考えられ、
実際に動的登録は上記の通りです
静的登録
//
public native void registerJava01(String text);
これは最も基本的な
Native
関数です.では、私たちが以前採用した静的登録はc/c++ファイルに記入することです.extern "C"
JNIEXPORT void JNICALL
Java_com_example_myndk_MainActivity_registerJava01(){}
では、これは静的登録です.つまり、名前は組み合わせられていますが、ソースコードを見てみると、そうではないことがわかりました.実際には、静的登録の方法で登録されています.
動的登録
動的登録とは、メソッド名とメソッド名の形式で書く必要がなく、1つ書くだけでいいということです.始めましょう.動的登録はこの方法を実現する必要があります.
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * javaVm,void * pVoid){}
この方法をどのように理解するかというと、AactivityのonCreateという方法と考えられ、
MainActivity
がロードされると、この方法が呼び出されます.//
JavaVM * jvm;
void register01(JNIEnv *env,jobject instance,jstring text)
{
const char* textValue = env->GetStringUTFChars(text,NULL);
__android_log_print(ANDROID_LOG_DEBUG,"hongbiao"," :%s",textValue);
env->ReleaseStringUTFChars(text,textValue);
}
// ,
/**
* typedef struct {
const char* name; java
const char* signature;
void* fnPtr; ,
} JNINativeMethod;
*/
RegisterNatives static const JNINativeMethod jniNativeMethod[] =
{
// ,
{"registerJava01","(Ljava/lang/String;)V",(void *)(register01)}
};
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * javaVm,void * pVoid){
::jvm = javaVm;
JNIEnv* jniEnv = nullptr;
// , evn
jint result = javaVm->GetEnv(reinterpret_cast<void **>(&jniEnv),
JNI_VERSION_1_6);
if(result!=JNI_OK){
return -1;
}
const char * mainActivityClassStr = "com/example/myndk/MainActivity";
jclass mainActivity = jniEnv->FindClass(mainActivityClassStr);
//
jniEnv->RegisterNatives(mainActivity,
jniNativeMethod,
//
sizeof(jniNativeMethod)/ sizeof(JNINativeMethod));
return JNI_VERSION_1_6;
}
実際に動的登録は上記の通りです