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

作者:徐影魔

出处:https://www.cnblogs.com/xunevermore/p/16447967.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   徐影魔  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示