1

私は Eclipse ADT を CDT と共に使用しています。JNI とインターフェースする NDK とともに、c/c++ に、Eclipse を介して Cygwin で c/c++ をコンパイルします。これは過去 2 週間にわたってセットアップされたばかりなので、すべてが最新バージョンを実行しているはずです。

ビルドすると、次のようになります。

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 構成でもこれまでにかなりの問題が発生しました。しかし、このトピックに関する他の質問から集めたものから、私は壁にぶつかり、この時点でどのように進めればよいかわかりません。提案?

以下を編集 - 回答

同僚とレビューした後 (2 番目の目が物事を明らかにするのに役立つ場合があります)、エラーを特定しました。クラス ラッパー .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

迅速な返信ありがとうございます。そして、これを行う別の方法。心に留めておきます。

4

1 に答える 1

0

testSockedClass.hpp は .c ファイルからインクルードされているため、C コンパイラでコンパイルされています。classC には存在しません。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");
}

NewStringUTFC++ と Cの呼び出しの形式に注意してください。

于 2013-10-30T19:16:34.623 に答える