簡體   English   中英

Android NDK / JNI - 自定義 header 文件中定義的對 function 的未定義引用

[英]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 ++中是不同的,因此您不能只更改文件擴展名。

只需在之間執行本機C ++代碼

extern "C" {
    your code
}

並非總是能奏效的事情-您可以在這里查看

嘗試添加到Android.mk文件中:

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

在這里,您可以找到有關它的更多信息

就我而言,我的項目構建正常,但在我添加兩個新文件 somefile.h 和 somefile.c 后它開始出現“未定義引用”錯誤。 我將這些文件添加到我構建的現有庫的源目錄中,因此不需要更改 cmake 來引用新文件。 清潔和重建項目沒有奏效。 但是,我在我的 CMakeLists.txt 文件中做了一些多余的更改,然后進行了干凈的重建。 構建成功。 之后我刪除了這個更改(因為它是多余的)並嘗試再次進行干凈的重建並且代碼正在運行。 也許構建系統正在從緩存中獲取一些對象,並且更改 CMakeLists.txt 迫使它從頭開始構建對象。 如果有人知道為什么會觀察到這種行為,請告訴我。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM