2011-12-25 27 views
7

Trong khi làm việc với một số nguồn tin viết bằng C++ Tôi tìm thấy những vĩ mô:JNIEXPORT và JNICALL trong Android NDK

JNIEXPORT return_type JNICALL function_name (...) { Tuy nhiên, Android NDK mẫu không sử dụng chúng. Tôi đọc một số tài liệu từ Oracle, nhưng tôi vẫn còn bối rối.

Tôi có nhất thiết phải sử dụng chúng khi làm việc với NDK của Android không?

Một trong những lý do cho hỏi - những vĩ mô cú pháp đột phá nổi bật trong eclipse CDT :)

Trả lời

10

Về cơ bản là một vấn đề cửa sổ, nếu bạn có một cái nhìn vào jni_md_win32.h tập tin mà đi kèm với oracle Java jdk này là định nghĩa macro:

/* 
* @(#)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_ */ 

Trong tiêu đề jni_md_linux.h các macro đó trống. Vì vậy, tôi đoán rằng miễn là bạn không muốn mã nguồn gốc của bạn được thực hiện trong các cửa sổ với JVM oracle, bạn có thể loại bỏ các macro đó.

+2

Và sự cố về Linux: '#define JNIEXPORT __attribute__ ((visibility (" default ")))' . Nó có thể được sử dụng với '-fvisibility = hidden' để giữ kích thước của bảng xuất khẩu xuống. Giảm kích thước bảng biểu tượng xuất giảm thời gian tải đối tượng chia sẻ và kích thước nhị phân. Xem [Khả năng hiển thị - GCC Wiki] (http://gcc.gnu.org/wiki/Visibility). – jww

1

Kiểm tra xem đường dẫn bao gồm nền tảng bạn muốn từ NDK của Android đã được thêm vào C \ C++ của dự án hay chưa. Điều này có thể được thực hiện như sau:

  • mở các thuộc tính dự án
  • Mở rộng C/C++ chung
  • Bấm Paths và biểu tượng
  • Trong Bao gồm phần Thêm đường dẫn đến bao gồm thư mục của nền tảng mong muốn của NDK (ví dụ: $ {ANDROID_NDK_HOME} \ platforms \ android-9 \ arch-arm \ usr \ include)