gpt4 book ai didi

android - 错误 : unknown type name 'class' NDK CDT JNI

转载 作者:太空宇宙 更新时间:2023-11-04 14:00:05 25 4
gpt4 key购买 nike

我将 Eclipse ADT 与:CDT 一起使用。随着 NDK 与 JNI 接口(interface),到 c/c++,通过 Eclipse 使用 Cygwin 编译 c/c++。一切都应该运行最新版本,因为这是在过去两周内刚刚设置的。

构建时我得到以下信息。

jni/testSocketClass.hpp:33:1: error: unknown type name 'class'
jni/testSocketClass.hpp:33:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
jni/ndkfoo.c:13:1: error: unknown type name 'mYNewClass'

JNI C 文件

#include <string.h>
#include <jni.h>
#include "testSocketClassWrapper.hpp"

void *m_GBLpmyCSocket;

ndkfoo.c
jstring Java_com_example_hydrobedcontrol1_MainActivity_inintNativeClass(JNIEnv * env, jobject object){

m_GBLpmyCSocket = MyClass_create();
MyClass_sendCommandToSerialDevice(m_GBLpmyCSocket, 0, 0, 0);
return (*env)->NewStringUTF(env, "started");
}

类包装.hpp

 //file testSocketClassWrapper.hpp
#ifndef _MY_SOCKETCLASS_WRAPPER_H
#define _MY_SOCKETCLASS_WRAPPER_H

#include"testSocketClass.hpp"//<<<<<<<<<<<<<<<<<<<<<Wrong inclusion


#ifdef __cplusplus

extern "C" void* MyClass_create() {
return new mYNewClass;
}
extern "C" void MyClass_release(void* myclass) {
delete static_cast<mYNewClass*>(myclass);
}
extern "C" void MyClass_sendCommandToSerialDevice(void* myclass, int cmd, int params, int id) {
static_cast<mYNewClass*>(myclass)->sendCommandToSerialDevice(cmd,params,id);
}

#endif
#endif /* _MY_SOCKETCLASS_WRAPPER_H_INCLUDED */

类包装.cpp

//file testSocketClassWrapper.cpp
#include "testSocketClassWrapper.hpp"

类.h

// file testSocketClass.hpp
class mYNewClass{///////////////////////ERROR HERE////////////////////////////////

//public:

void sendCommandToSerialDevice(int Command, int Parameters, int DeviceID);
//int sockfd;

};

类.cpp

// file testSocketClass.cpp
#include "testSocketClass.hpp"

void mYNewClass::sendCommandToSerialDevice(int Command, int Parameters, int DeviceID){

char testc[100];
sprintf(testc, "%d, %d, %d", Command, Parameters, DeviceID);

}

我已经阅读了无数关于这个主题的问题,并且在 Eclipse 配置方面也遇到了很多问题。但是从我从关于这个主题的其他问题中收集到的信息来看,我遇到了困难,现在不知道如何进行。有什么建议吗?

编辑下方 - 答案

在与同事一起审查后(有时第二双眼睛有助于发现问题),我们找到了我的错误。请参阅类包装器 .hpp 中标记为不正确包含的行。该 header 应按如下方式在类包装器 .cpp 中重定位 注意:也移至 .cpp 的函数和 .hpp 现在为空。

//file testSocketClassWrapper.cpp
#include "testSocketClassWrapper.hpp"
#include "testSocketClass.hpp"

extern "C" void* MyClass_create() {
return new mYNewClass;
}
extern "C" void MyClass_release(void* myclass) {
delete static_cast<mYNewClass*>(myclass);
}
extern "C" void MyClass_sendCommandToSerialDevice(void* myclass, int cmd, int params, int id) {
static_cast<mYNewClass*>(myclass)->sendCommandToSerialDevice(cmd,params,id);
}

另外为了完整性,因为这不是在公园里散步,所以是 MK 文件。

Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE := ndkfoo
LOCAL_SRC_FILES := ndkfoo.c testSocketClassWrapper.cpp testSocketClass.cpp

include $(BUILD_SHARED_LIBRARY)


Application.mk
APP_STL:=stlport_static

感谢您及时回复krsteeve。还有另一种方法来做到这一点。会记住的。

最佳答案

testSockedClass.hpp 是从 .c 文件中包含的,所以它是用 C 编译器编译的。 class 在 C 中不存在。将 ndkfoo.c 更改为 .cpp 文件。

在 C++ 中,您必须以不同的方式格式化内容:

extern "C"
{
jstring Java_com_example_hydrobedcontrol1_MainActivity_inintNativeClass(JNIEnv * env, jobject object);
}

jstring Java_com_example_hydrobedcontrol1_MainActivity_inintNativeClass(JNIEnv * env, jobject object){

m_GBLpmyCSocket = MyClass_create();
MyClass_sendCommandToSerialDevice(m_GBLpmyCSocket, 0, 0, 0);
return env->NewStringUTF("started");
}

注意 C++ 与 C 中 NewStringUTF 调用的形式。

关于android - 错误 : unknown type name 'class' NDK CDT JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com