Tất cả các mẫu ndk chỉ sử dụng các hàm C cơ bản được khai báo là extern trong phần đầu và được định nghĩa trong tệp cpp. Sau đó, sau khi bao gồm các tập tin tiêu đề trong tập tin C có chứa gọi lại jni, mọi thứ hoạt động tốt.Sử dụng C++ với Android ndk/jni
Có thể sử dụng các lớp C++ với android ndk không? Ứng dụng của tôi sẽ không phải là một hoạt động gốc, nó vẫn sẽ có một phần java quan trọng nhưng nó sẽ gọi mã C bản địa để tính toán CPU chuyên sâu (đã được viết bằng C++, với các lớp và các công cụ C++ khác).
Đây là của tôi hello-thế giới như strcuture cho bây giờ:
File "first.h"
#ifndef FIRST_H
#define FIRST_H
class Test
{};
#endif /* FIRST_H */
File "second.cpp"
#include <jni.h>
#include "first.h"
#ifdef __cplusplus
extern "C" {
#endif
jint Java_com_example_twolibs_TwoLibs_add(JNIEnv* env,
jobject this,
jint x,
jint y)
{
Test t;
return 0;
}
#ifdef __cplusplus
}
#endif
Và cuối cùng Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.cpp
include $(BUILD_SHARED_LIBRARY)
Prett y cơ bản nhưng điều đó không biên dịch. Quay second.cpp trong một tệp .c làm tăng lỗi khi đưa vào tệp tiêu đề, tôi đoán điều này là do nó không phải là tệp C++.
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
Làm cho nó cpp tăng các lỗi sau:
make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'. Stop.
Bất kỳ ý tưởng làm thế nào tôi có thể làm điều đó biên dịch?
Cảm ơn
Có vẻ như mã C gọi lại (tệp chứa các cuộc gọi như Java_com_example_twolibs_TwoLibs_add được gọi từ phía java) phải nằm trong tệp .c (không phải .cpp). Nếu không nó không biên dịch trên máy tính của tôi. Vì vậy, khi tôi cố gắng bao gồm một tập tin tiêu đề có chứa một tuyên bố lớp học, cùng một lỗi đi lên. – user745189
Turing mọi thứ vào tập tin .cpp cho phép tôi thực hiện: *** Không có quy tắc nào để tạo lỗi mục tiêu có nghĩa là tệp tạo tệp không thể tìm thấy tệp nguồn ... nhưng nếu tôi chuyển chúng thành tệp .c thì đây không phải là một vấn đề đường dẫn tôi đoán – user745189
Nó phải biên dịch, nhưng bạn cần thêm 'bên ngoài" C "' vào tất cả các hàm JNI. Bạn đã thay đổi phần mở rộng tập tin nguồn trong makefile chưa? – Michael