为什么要有静态注册呢,是因为java层和so层的函数需要一一对应,不会找错了。比如下面的。
public native String stringFromJNI();
那是怎么样对应起来的呢。
是通过跳转的函数名字,非常的有规律
Java_com_example_demonndk_MainActivity_stringFromJNI
是java,然后包名,然后类名,然后才是名字。这就是静态注册。
jclass,因为静态方法不依赖对象实例,而依赖于类,所以参数中传递的是一个jclass
类型。相反,如果声明的Native方法时非静态方法时,那么对应参数是jobject
。
extern "C" JNIEXPORT jstring JNICALL 告诉是以c的方式进行#include <android/log.h> 就可以使用__android_log_print(3,“moting”,__VA_ARGS__)了;简化的可以为logd
就可以直接用了
logd(“hello”);
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 ("+++++++");
先有一个线程变量,然后创建线程。
在上方建一个函数
void* myThread(void* a){
for (int i = 0; i <9; ++i) {
logd("myThread%d",i);
}
pthread_exit(0);
}
pthread_join(pthread, nullptr) 就是先执行线程里的,然后执行下面的代码。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 ("===============");
用指针传进去
void* myThread(void* a){
int *num= static_cast<int *>(a);
for (int i = 0; i <*num; ++i) {
logd("myThread%d",i);
}
pthread_exit(0);
}
创建一个线程
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 ("===============");
然后接着传指针。
init -》 init_array-》 jni_onload
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;
}
一个so中可以没有JNI_ONLOAD,比如创建一个新线程。必须返回JNI的版本
JNIENV和JNIVm 的区别
JavaVM* globalVM;如何使用env调用vm,函数第一个参数是env
JavaVM *vm1;
env->GetJavaVM(&vm1);
globalVm=vm1;
vm1就有值了
或者JNI_OnLoad的第一个参数
主线程里
if (vm->GetEnv((void **)&env,JNI_VERSION_1_6)!=JNI_OK){
logd("getenv filed");
}
子线程里