[英]Android NDK JNI build error: undefined reference to 'function_name'
[英]Android NDK / JNI - undefined reference to function defined in custom header file
使用 JNI,我正在嘗試為 Android NDK 編寫本機 C++ 方法,該方法調用自定義 header 文件中定義的 C function。 但是,我的 C function 調用出現未定義的引用錯誤。
這是我的 C++ 代碼,它調用 C function 並將其結果作為 jstring 返回給 Java:
#include <jni.h>
#include "gesture_detector.h"
JNIEXPORT jstring JNICALL Java_com_example_bmtitest_JavaAbstractionLayer_callGestureAnalysis(JNIEnv *env, jobject obj, jfloat previousX, jfloat previousY, jfloat currentX, jfloat currentY) {
return env->NewStringUTF(gestureAnalysis(previousX, previousY, currentX, currentY));
}
這是我的 C function:
#include <stdio.h>
#include "gesture_detector.h"
//implemented from gesture_detector.h
const char* gestureAnalysis(float previousX, float previousY, float currentX, float currentY)
{
float xOffset = currentX - previousX;
float yOffset = currentY - previousY;
if(xOffset == 0 && yOffset == 0)
{
return "TAP";
}
return "0";
}
這是我的 Android.mk 代碼:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gestureDetector
LOCAL_SRC_FILES := gestureDetector.c NativeAbstractionLayer.cpp
LOCAL_LDLIBS := -landroid
include $(BUILD_SHARED_LIBRARY)
顯然,似乎找不到自定義 header 文件 ( gesture_detector.h
) 中定義的 function 定義。 我認為這可能是我的 Android.mk 文件中的問題。
誰能告訴我我在這里做錯了什么?
鏈接器出現“未定義引用”錯誤。 您的頭文件僅滿足編譯器的要求。
但是,由於您混合使用C和C ++,因此您的問題很可能是名稱修改 。 基本上,您需要告訴C ++編譯器您要調用的函數是由C編譯器而非C ++編譯器創建的,因此其名稱上沒有嫁接參數類型代碼。 現在,它尚不知道,因此正在嘗試使用C ++樣式修飾的名稱來調用該函數,該名稱不同於鏈接器實際可用的普通C名稱。
將此添加到您的gesture_detector.h文件的開頭:
#ifdef __cplusplus
extern "C" {
#endif
最后這個
#ifdef __cplusplus
}
#endif
並進行干凈的重建。
如果您真正的jni膠合邏輯與此處介紹的版本一樣瑣碎,則也可以選擇將其切換為C版本-但請注意,jni語法在C和C ++中是不同的,因此您不能只更改文件擴展名。
就我而言,我的項目構建正常,但在我添加兩個新文件 somefile.h 和 somefile.c 后它開始出現“未定義引用”錯誤。 我將這些文件添加到我構建的現有庫的源目錄中,因此不需要更改 cmake 來引用新文件。 清潔和重建項目沒有奏效。 但是,我在我的 CMakeLists.txt 文件中做了一些多余的更改,然后進行了干凈的重建。 構建成功。 之后我刪除了這個更改(因為它是多余的)並嘗試再次進行干凈的重建並且代碼正在運行。 也許構建系統正在從緩存中獲取一些對象,並且更改 CMakeLists.txt 迫使它從頭開始構建對象。 如果有人知道為什么會觀察到這種行為,請告訴我。 謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.