在 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 的答案中所示。
我在 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 的答案中所示。