NDK動的登録

7933 ワード

NDKについてはご存知のように
静的登録
    //    
    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;
}

実際に動的登録は上記の通りです