【问题标题】:Create a C++ class and Use that class In Another C++ Class Which contain JNI methods in ndk android创建一个 C++ 类并在另一个包含 ndk android 中的 JNI 方法的 C++ 类中使用该类
【发布时间】:2017-07-27 05:29:21
【问题描述】:

在 Android 中,我在连接原生 Android 中的两个 cpp 类时遇到问题。我已经测试过它工作正常的单个类。

但是当我创建了另一个文件并且现在在将其与当前 cpp 文件链接时遇到问题。

MainClass.cpp

#include <jni.h>
#include "native-handler.h"

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_fragment_SampleFragment_setTitle(JNIEnv *env,jobject instance,jobject context) {

    ClassNativeHandler classNativeHandler;
    return classNativeHandler.getType(env,context);
}

native-handler.cpp

#include <jni.h>
#include "native-handler.h"

jstring jstringObject;

jstring ClassNativeHandler::getType(JNIEnv *env, jobject contextObject) {
    jstring jstringObject = env->NewStringUTF("Hello world");
    return jstringObject;
}

void ClassNativeHandler::setType(jstring string) {
    myType = string;
    jstringObject = string;
}

native-handler.h

#ifndef SAMPLE_NATIVE_HANDLER_H
#define SAMPLE_NATIVE_HANDLER_H

#include <iostream>
#include <string>

class ClassNativeHandler
{
private:
    jstring myType;

public:
    void setType(jstring string);
    jstring getType(JNIEnv *env, jobject contextObject);
    jstring getHeaderName(JNIEnv *env);

};

#endif //SAMPLE_NATIVE_HANDLER_H

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := Native
LOCAL_SRC_FILES := ../cpp/mainClass.cpp
LOCAL_C_INCLUDES := ../cpp/native-handler.h
LOCAL_LDLIBS := -lz -llog -ljnigraphics
include $(BUILD_SHARED_LIBRARY)

错误:对 `ClassNativeHandler::getType(_JNIEnv*, _jobject*)' 的未定义引用

在这条线上 return classNativeHandler.getType(env,context);

所以我无法构建 .so 文件。请指导我

【问题讨论】:

  • 这个问题和Java有什么关系?

标签: android c++ android-ndk native


【解决方案1】:

你还没有编译native-handler.cpp。您需要在LOCAL_SRC_FILES 中指定它,以便NDK 编译它。

LOCAL_SRC_FILES := ../cpp/mainClass.cpp ../cpp/native-handler.cpp

【讨论】:

  • 现在我可以编译文件,但是在运行应用程序时出现错误,例如 { JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x7f5bc55a3d }
  • ClassNativeHandler::getType 内部定义了本地jstring jstringObject,有效地隐藏了可能导致无效本地引用错误的全局jstringObject
  • 当再次指向获取 null 的位置时,它不会存储在内存中,因此在使用 locai 变量 jstring jstringObjectClassNativeHandler::getType 上出现错误b>
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2014-01-26
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多