当前位置:网站首页>NDK beginner's study (1)

NDK beginner's study (1)

2022-07-07 14:11:00 v_ three billion four hundred and eighty-three million six hund

NDK Knowledge

1. Static registration .

Why should there be static registration , Because java Layer and the so The functions of the layer need to be mapped one by one , You can't get it wrong . Like the following .


  public native String stringFromJNI();

How does that correspond .

Is the name of the function through jump , Very regular

Java_com_example_demonndk_MainActivity_stringFromJNI

yes java, Then the package name , Then the class name , Then the name . This is static registration .


JNIEnv env: Like jni Environment , It can be used to call c Layer of java. Or is it java Data type to c Data type of ,c Data to java Data conversion of data type .


The first parameter ,jobject: Like this The pointer , Know which place called so This function of layer


The second parameter ,jclass and jobject The distinction between : What should be declared Native When the method is static , Corresponding parameter jclass

, Because static methods don't rely on object instances , It depends on the class , So the parameter passed is a jclass
type . contrary , If it says Native Method time is not static method time , So the corresponding parameter is jobject
.

extern "C" JNIEXPORT jstring JNICALL Tell me so c By

The static registration function must be an export function JNIEXPORT

LOGD Output Head introduction #include <android/log.h> You can use __android_log_print(3,“moting”,__VA_ARGS__) 了 ;

Simplified can be logd
You can use it directly

logd(“hello”);


Create thread

pthread_t pthread;
    //int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*);
    pthread_create(&pthread, nullptr,myThread, nullptr);
		logd ("+++++++");

First there is a thread variable , Then create the thread .

Build a function above

void* myThread(void* a){
    
    for (int i = 0; i <9; ++i) {
    
        logd("myThread%d",i);
    }
    pthread_exit(0);
}

added pthread_join(pthread, nullptr) Is to execute in the thread first , Then execute the following code .

Send a number into the thread

pthread_t pthread;
    int num=4;
    //int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*);
    pthread_create(&pthread, nullptr, myThread, &num);
    pthread_join(pthread, nullptr);
    logd ("===============");

Pass it in with a pointer

void* myThread(void* a){
    
    int *num= static_cast<int *>(a);
    for (int i = 0; i <*num; ++i) {
    
        logd("myThread%d",i);
    }
    pthread_exit(0);
}

Pass a structure into the thread

Create a thread

struct moting{
    
    std::string name;
    int  age;
    bool sex;
};

moting aaa;
    aaa.name="moting";
    aaa.age=3;
    aaa.sex= true;

    pthread_t pthread;
    //int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*);
    pthread_create(&pthread, nullptr, myThread, &aaa);
    pthread_join(pthread, nullptr);
    logd ("===============");

Then pass the pointer .

c Language return values are rarely used ,


so Execution timing of various functions in

init -》 init_array-》 jni_onload


jnionload Rewriting of

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
    
    JNIEnv *env= nullptr;
    if (vm->GetEnv((void **)&env,JNI_VERSION_1_6)!=JNI_OK){
    
        logd("getenv filed");
    }
    logd("JNI_Onload%p",env);
    return JNI_VERSION_1_6;
}

One so There can be no JNI_ONLOAD, For example, create a new thread . Must return JNI Version of


JNIENV and JNIVm The difference between

JNIENV and JNIVm, Defines a global variable JavaVM* globalVM;

How to use env call vm, The first argument to the function is env

		JavaVM *vm1;
    env->GetJavaVM(&vm1);
		globalVm=vm1;

vm1 It's worth it

perhaps JNI_OnLoad The first parameter of

  1. vm Get env

In the main route

if (vm->GetEnv((void **)&env,JNI_VERSION_1_6)!=JNI_OK){
    
        logd("getenv filed");
    }

In the sub thread

原网站

版权声明
本文为[v_ three billion four hundred and eighty-three million six hund]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071210103702.html