无法在Android中的单个本机C ++库文件中使用多个函数

时间:2018-04-18 13:56:29

标签: android c++ java-native-interface

我正在开发一个使用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中的错误似乎与问题无关。

enter image description here

如何在单个本机c ++库文件中解决问题并使用多个函数?

1 个答案:

答案 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());
}