错误:未知类型名称'class'NDK CDT JNI

时间:2013-10-30 18:19:26

标签: android c++ android-ndk java-native-interface eclipse-cdt

我正在使用Eclipse ADT:CDT。随着NDK与JNI的连接,到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");
}

Class Wrapper .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;

 };

Class .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中标记为包含不正确的行。该标题应该在类包装器中重新定位.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。还有另一种方法。请牢记这一点。

1 个答案:

答案 0 :(得分:0)

testSockedClass.hpp包含在.c文件中,所以它是用C编译器编译的。 C中不存在class。将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调用的形式。