当前位置:网站首页>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
- 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
边栏推荐
- Build a secure and trusted computing platform based on Kunpeng's native security
- 数据流图,数据字典
- mysql导入文件出现Data truncated for column ‘xxx’ at row 1的原因
- IP address home location query
- [high frequency interview questions] difficulty 2.5/5, simple combination of DFS trie template level application questions
- 648. Word replacement: the classic application of dictionary tree
- Use day JS let time (displayed as minutes, hours, days, months, and so on)
- Details of redis core data structure & new features of redis 6
- Laravel5 call to undefined function OpenSSL cipher IV length() error php7 failed to open OpenSSL extension
- Battle Atlas: 12 scenarios detailing the requirements for container safety construction
猜你喜欢
Selenium库
常用數字信號編碼之反向不歸零碼碼、曼徹斯特編碼、差分曼徹斯特編碼
数据库系统概论-第一章绪论【概念模型、层次模型和三级模式(外模式、模式、内模式)】
2022-7-6 beginner redis (I) download, install and run redis under Linux
[fortress machine] what is the difference between cloud fortress machine and ordinary fortress machine?
数据流图,数据字典
Wired network IP address of VMware shared host
2022-7-7 Leetcode 844.比较含退格的字符串
Leecode3. Longest substring without repeated characters
2022-7-6 Leetcode 977. Square of ordered array
随机推荐
【AI实战】应用xgboost.XGBRegressor搭建空气质量预测模型(二)
常用數字信號編碼之反向不歸零碼碼、曼徹斯特編碼、差分曼徹斯特編碼
118. 杨辉三角
最长上升子序列模型 AcWing 1014. 登山
Mathématiques avancées - - chapitre 8 différenciation des fonctions multivariables 1
Is the compass stock software reliable? Is it safe to trade stocks?
Dry goods | summarize the linkage use of those vulnerability tools
带你掌握三层架构(建议收藏)
社会责任·价值共创,中关村网络安全与信息化产业联盟对话网信企业家海泰方圆董事长姜海舟先生
Battle Atlas: 12 scenarios detailing the requirements for container safety construction
UML 顺序图(时序图)
内存溢出和内存泄漏的区别
PostgreSQL array type, each splice
How does MySQL control the number of replace?
Excerpt from "misogyny: female disgust in Japan"
The meaning of variables starting with underscores in PHP
Codes de non - retour à zéro inversés, codes Manchester et codes Manchester différentiels couramment utilisés pour le codage des signaux numériques
.net core 关于redis的pipeline以及事务
When FC connects to the database, do you have to use a custom domain name to access it outside?
postgresql array类型,每一项拼接