zoukankan      html  css  js  c++  java
  • Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

    利用Android NDK编译动态库,在C文件中调用了两个JNI函数:JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM。编译的时候始终报以下错误:

    XXX: undefined reference to `JNI_GetDefaultJavaVMInitArgs'
    XXX: undefined reference to `JNI_CreateJavaVM'

    看了网上很多人的解答,基本都是添加libjvm.so或者libnativehelper库。尝试下,没有一个靠普的。不是说人家的方法不靠普,而是这种方法不适合用于Android。原因是NDK根本没有将这两个接口导出来,这个在jni.h中有说明,位于1110行,内容如下:

    /*
     * VM initialization functions.
     *
     * Note these are the only symbols exported for JNI by the VM.
     */
    #if 0  /* In practice, these are not exported by the NDK so don't declare them */
    jint JNI_GetDefaultJavaVMInitArgs(void*);
    jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
    jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
    #endif

    看,这里显然将两个函数给屏蔽掉了,所以不能直接用。

     看来常规的JNI有些时候对Android不适用。虽然Android将这条路封了,不过还是开了另外一扇门,给了另外两个函数用于注册自己编写的本地JNI函数,见jni.h的1125行,内容如下:

    /*
     * Prototypes for functions exported by loadable shared libs.  These are
     * called by JNI, not provided by JNI.
     */
    JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
    JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);

    这个也是我经常用的动态接口注册函数

  • 相关阅读:
    if elseif else
    java编程思想第四版中net.mindview.util包
    eclipse git插件配置
    php面试常用算法
    数据库字段类型中char和Varchar区别
    MySQL的数据库引擎的类型及区别
    windows系统中eclipse C c++开发环境的搭建
    launch failed.Binary not found in Linux/Ubuntu解决方案
    技术团队的情绪与效率
    如何有效使用Project(2)——进度计划的执行与监控
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/10605639.html
Copyright © 2011-2022 走看看