所有ndk樣本僅使用在頭文件中聲明爲extern並在cpp文件中定義的基本C函數。然後在包含jni回調的C文件中包含頭文件後,一切正常。在Android中使用C++ ndk/jni
是否有可能使用android ndk的C++類?我的應用程序不會是一個本地活動,它仍然有一個重要的Java部分,但它會調用CPU密集型計算的本機C代碼(已經用C++編寫,帶有類和其他C++東西)。
這是我打招呼世界狀晶格結構現在:
文件 「first.h」
#ifndef FIRST_H
#define FIRST_H
class Test
{};
#endif /* FIRST_H */
文件 「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
最後Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.cpp
include $(BUILD_SHARED_LIBRARY)
Prett Ÿ基本但不能編譯。在.c文件中加入second.cpp會引發包含頭文件的錯誤,我想這是因爲它不是C++文件。
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
製作它的.cpp引發以下錯誤:
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.
任何想法,我怎麼可以讓那個東西編譯?
謝謝
看起來好像回調C代碼(包含諸如Java_com_example_twolibs_TwoLibs_add之類的調用的文件將從java端調用)必須位於.c文件(不是.cpp)中。否則,它不會在我的機器上編譯。因此,當我試圖包含一個包含類聲明的頭文件時,會出現相同的錯誤。 – user745189
將一切轉換成.cpp文件給了我一個make:***沒有規則來製作目標錯誤,這意味着make文件找不到源文件......但是,如果我將它們轉換爲.c文件,一個路徑問題我猜想 – user745189
它必須編譯,但是你需要爲所有JNI函數添加'external「C」'。你是否改變了makefile中的源文件擴展名? – Michael