在 NDK 项目上添加另一个 C 源和 Header

Add Another C Source and Header on NDK Project

我在 jni 文件夹中添加了一个简单的 header 和 c 文件。

-jni
   -calculate.c
   -calculate.h
   -HelloJNI.cpp
   -Android.MK

这是代码。 一种。 calculate.h

int add(int x, int y);
int minus(int x, int y);

b。 calculate.c

#include "calculate.h"

/**
 * Implementation add
 */
int add(int x, int y){
    return x + y;
}

/**
 * Implementation minus
 */
int minus(int x, int y){
    return x - y;
}

c.HelloJNI.cpp

#include <jni.h>
#include <android/log.h>
#include <string.h>
#include "calculate.h"

extern "C" {
     JNIEXPORT jstring JNICALL Java_com_farissyariati_hellojni_MainActivity_stringFromJni(JNIEnv *env, jobject obj);
};

JNIEXPORT jstring JNICALL Java_com_farissyariati_hellojni_MainActivity_stringFromJni(JNIEnv *env, jobject obj){
    //Calculate *myCalculate = new Calculate();
    //int result = myCalculate->add(10,20);
    int res = add(10, 20);
    return env->NewStringUTF("Hello From CPP");
}

添加此代码之前: int res = add(10, 20);

应用程序 运行 符合预期。假设,我必须在 Android.mk 中添加一些东西,我应该为它添加什么?这是我的 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := HelloJNI
LOCAL_SRC_FILES := HelloJNI.cpp
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)

更新。

我把我的 Android.mk 改成了这样,但还是不行。

LOCAL_PATH := $(call my-dir)
MY_SRC_FILE = /Users/farissyariati/Documents/EclipseProjects/HelloJNI/jni

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloJNI
LOCAL_SRC_FILES := HelloJNI.cpp

LOCAL_C_INCLUDES := $(MY_SRC_FILE)/calculate/
LOCAL_SRC_FILES  += $(MY_SRC_FILE)/calculate/calculate.c
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

您可以在一行中指定多个源文件,如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := HelloJNI
LOCAL_SRC_FILES := HelloJNI.cpp calculate.c
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)

但是,由于您是从 C++ 调用 C 代码,因此您需要使用 extern "C" 来指定 C 样式的链接。您可以像这样包装 #include(在 HelloJNI.cpp 中):

extern "C" {
    #include "calculate.h"
}

或者,您可以更改 calculate.h 以处理与 C++ 代码的链接,如 this question 的答案中所示。