Loading

NDK学习

JavaVM 和 JNIEnv

JNI 定义了两个关键数据结构,即“JavaVM”和“JNIEnv”。两者本质上都是指向函数表的二级指针。(在 C++ 版本中,它们是一些类,这些类具有指向函数表的指针,并具有每个通过该函数表间接调用的 JNI 函数的成员函数。)JavaVM 提供“调用接口”函数,您可以利用此类来函数创建和销毁 JavaVM。理论上,每个进程可以有多个 JavaVM,但 Android 只允许有一个。

JNIEnv 提供了大部分 JNI 函数。您的原生函数都会收到 JNIEnv 作为第一个参数。

该 JNIEnv 将用于线程本地存储。因此,您无法在线程之间共享 JNIEnv。如果一段代码无法通过其他方法获取自己的 JNIEnv,您应该共享相应 JavaVM,然后使用 GetEnv 发现线程的 JNIEnv。(假设该线程包含一个 JNIEnv;请参阅下面的 AttachCurrentThread。)

JNIEnv 和 JavaVM 的 C 声明与 C++ 声明不同。"jni.h" include 文件会提供不同的类型定义符,具体取决于该文件是包含在 C 还是 C++ 中。因此,我们不建议在这两种语言包含的头文件中添加 NIEnv 参数。(换个说法:如果您的头文件需要 #ifdef __cplusplus,且该标头中有任何内容引用 JNIEnv,您可能都必须进行一些额外操作。)

其他子线程获取JNIEnv

    JavaVM *javaVM = pctx->javaVM;
    JNIEnv *env;
    jint res = (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_6);
    if (res != JNI_OK) {
        res = (*javaVM)->AttachCurrentThread(javaVM, &env, NULL);
        if (JNI_OK != res) {
            LOGE("Failed to AttachCurrentThread, ErrorCode = %d", res);
            return NULL;
        }
    }

AIDL 生成 C++代码

AIDL可生成C++代码,Binder API

Other

  • 静态库和动态库区别
    1.时期:
    静态库在编译时连接,在链接时拷贝
    动态库在运行时连接
    2.资源
    静态库在每次使用时将全部连接进可执行程序,浪费资源。
    动态库在使用时访问动态库中函数,节省资源。
    3.更新升级
    静态库更新,则每个使用该静态库的程序都需要更新,不易于更新升级
    动态库仅更新自身,易于更新升级
    4.包含其他库
    静态链接库不能再包含其他动态链接库
    动态链接库可以包含其他动态链接库
    ————————————————
    版权声明:本文为CSDN博主「htt789」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/htt789/article/details/81454832

  • NDK lib Location

C:\Users\username\AppData\Local\Android\Sdk\ndk\ndkversion\sysroot\usr\include

  • gcc
    通过gcc可以把C代码源文件编译成可执行文件
gcc test.c -o test.exe

编译test.c会生成test.exe

posted @ 2022-07-05 18:16  徐影魔  阅读(35)  评论(0)    收藏  举报