我正在开发一个使用C ++本机库的Android应用程序。我已经将c ++集成到我的项目中,并成功通过JNI从Java调用C ++函数。但问题是我无法在单个C ++本机库中声明多个函数。
这是我在native-lib.cpp文件中的本机C ++代码
#include <jni.h>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <fstream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/stitching.hpp>
#include <vector>
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT
jstring
Java_media_memento_memento_SphereCameraActivity_stitchPhotos(
JNIEnv *env,
jobject ) {
std::string hello = "This is the function one";
return env->NewStringUTF(hello.c_str());
}
}
从Java中,我像这样加载库
static {
System.loadLibrary("native-lib");
}
并调用该函数。它工作正常。但我试图将新函数添加到native-lib.cpp中,如下所示。
#include <jni.h>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <fstream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/stitching.hpp>
#include <vector>
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT
jstring
Java_media_memento_memento_SphereCameraActivity_stitchPhotos(
JNIEnv *env,
jobject ) {
std::string hello = "This is the function one";
return env->NewStringUTF(hello.c_str());
}
JNIEXPORT
jstring
Java_media_memento_memento_SphereCameraActivity_sayHello(
JNIEnv *env,
jobject ) {
std::string hello = "Stitching the photo in C++";
return env->NewStringUTF(hello.c_str());
}
}
如您所见,新功能是sayHello。当我运行我的应用程序并从java调用sayHello函数时,应用程序崩溃。
logcat中的错误似乎与问题无关。
如何在单个本机c ++库文件中解决问题并使用多个函数?
答案 0 :(得分:1)
我尝试过这种方法,并且可以正常工作:
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring
JNICALL
Java_com_package_name_Keys_apiKey(JNIEnv *env, jobject object)
{
std::string api_key = "https://api.api.net";
return env->NewStringUTF(api_key.c_str());
}
extern "C" JNIEXPORT jstring
JNICALL
Java_com_package_name_Keys_imageApiKey(JNIEnv *env, jobject object)
{
std::string image_api_key = "https://api.api.com/";
return env->NewStringUTF(image_api_key.c_str());
}