【问题标题】:JNIEXPORT and JNICALL in Android NDKAndroid NDK 中的 JNIEXPORT 和 JNICALL
【发布时间】:2011-12-25 12:02:06
【问题描述】:

在处理一些用 C++ 编写的源代码时,我发现了这些宏:

JNIEXPORT return_type JNICALL function_name(...) { 但是,Android NDK 示例不使用它们。我从 Oracle 阅读了一些文档,但我仍然感到困惑。

在使用 Android NDK 时我是否必须使用它们?

询问的原因之一 - eclipse CDT 中突出显示的那些宏中断语法:)

【问题讨论】:

    标签: android c++ android-ndk java-native-interface


    【解决方案1】:

    基本上是windows问题,如果你看一下oracle Java jdk附带的文件jni_md_win32.h,这是宏定义:

    /*
     * @(#)jni_md.h 1.14 03/12/19
     *
     * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
     * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
     */
    
    #ifndef _JAVASOFT_JNI_MD_H_
    #define _JAVASOFT_JNI_MD_H_
    
    #define JNIEXPORT __declspec(dllexport)
    #define JNIIMPORT __declspec(dllimport)
    #define JNICALL __stdcall
    
    typedef long jint;
    typedef __int64 jlong;
    typedef signed char jbyte;
    
    #endif /* !_JAVASOFT_JNI_MD_H_ */
    

    在头文件 jni_md_linux.h 中,这些宏是空的。所以我想只要你不希望你的本机代码在带有 oracle JVM 的 Windows 中执行,你就可以删除这些宏。

    【讨论】:

    • 还有一个 Linux 问题:#define JNIEXPORT __attribute__ ((visibility ("default")))。它可能与-fvisibility=hidden 一起使用以减小导出表的大小。减小导出符号表大小会减少共享对象加载时间和二进制大小。见Visibility - GCC Wiki
    【解决方案2】:

    检查您希望从 Android NDK 获得的平台的包含路径是否已添加到项目的 C\C++ 包含中。这可以按如下方式完成:

    • 打开项目属性
    • 扩展 C/C++ 常规
    • 点击路径和符号
    • 在 Includes 部分添加 NDK 所需平台的包含文件夹的路径(例如 ${ANDROID_NDK_HOME}\platforms\android-9\arch-arm\usr\include )

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2015-08-28
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多