【问题标题】: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 )