当前位置:网站首页>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
边栏推荐
- wpf dataGrid 实现单行某个数据变化 ui 界面随之响应
- 参数关键字Final,Flags,Internal,映射关键字Internal
- Excuse me, when using Flink SQL sink data to Kafka, the execution is successful, but there is no number in Kafka
- When FC connects to the database, do you have to use a custom domain name to access it outside?
- docker部署oracle
- Lavarel之环境配置 .env
- 请问,redis没有消费消息,都在redis里堆着是怎么回事?用的是cerely 。
- Selenium库
- Reverse non return to zero code, Manchester code and differential Manchester code of common digital signal coding
- Build a secure and trusted computing platform based on Kunpeng's native security
猜你喜欢

常用數字信號編碼之反向不歸零碼碼、曼徹斯特編碼、差分曼徹斯特編碼

Mathématiques avancées - - chapitre 8 différenciation des fonctions multivariables 1

js 获取当前时间 年月日,uniapp定位 小程序打开地图选择地点

UML 顺序图(时序图)

2022-7-6 使用SIGURG来接受外带数据,不知道为什么打印不出来

2022-7-6 Leetcode 977.有序数组的平方

. Net core about redis pipeline and transactions

Advanced Mathematics - Chapter 8 differential calculus of multivariate functions 1

2022-7-6 初学redis(一)在 Linux 下下载安装并运行 redis

2022-7-6 Leetcode27. Remove the element - I haven't done the problem for a long time. It's such an embarrassing day for double pointers
随机推荐
2022-7-6 beginner redis (I) download, install and run redis under Linux
社会责任·价值共创,中关村网络安全与信息化产业联盟对话网信企业家海泰方圆董事长姜海舟先生
Reverse non return to zero code, Manchester code and differential Manchester code of common digital signal coding
Hands on Teaching: XML modeling
Excusez - moi, l'exécution a été réussie lors de l'utilisation des données de puits SQL Flink à Kafka, mais il n'y a pas de nombre dans Kafka
Lavarel之环境配置 .env
常用数字信号编码之反向不归零码码、曼彻斯特编码、差分曼彻斯特编码
为租客提供帮助
The delivery efficiency is increased by 52 times, and the operation efficiency is increased by 10 times. See the compilation of practical cases of financial cloud native technology (with download)
"Song of ice and fire" in the eleventh issue of "open source Roundtable" -- how to balance the natural contradiction between open source and security?
最长上升子序列模型 AcWing 1012. 友好城市
mysql导入文件出现Data truncated for column ‘xxx’ at row 1的原因
Cargo placement problem
Supply chain supply and demand estimation - [time series]
Excuse me, as shown in the figure, the python cloud function prompt uses the pymysql module. What's the matter?
Is it safe to open an account online now? Which securities company should I choose to open an account online?
call undefined function openssl_cipher_iv_length
requires php ~7.1 -&gt; your PHP version (7.0.18) does not satisfy that requirement
2022-7-7 Leetcode 844. Compare strings with backspace
请问,redis没有消费消息,都在redis里堆着是怎么回事?用的是cerely 。