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

时间:2015-04-05 22:53:53

标签: android android-ndk java-native-interface

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

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

这是代码。 一个。 calculate.h

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

湾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)

1 个答案:

答案 0 :(得分:0)

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

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&#34; C&#34;指定C风格的链接。您可以像这样包装#include(在HelloJNI.cpp中):

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

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