3

Android アプリで使用する Java ラッパーをいくつか使用して C++ ライブラリ (VRPN) をコンパイルしようとしています。ndk-build コマンドを使用すると、ライブラリ内のオブジェクトのコンストラクターを参照する C++ インターフェイス ファイルの最初の行で「未定義の参照」エラーが発生します。コードが正しいことはかなり確信しています。呼び出しはメソッド ヘッダーと一致し、実装されていることを確認するためのヘッダー ファイルとソース ファイルの両方があります。問題は、現在単一のクラスのみを参照している Android.mk ファイルにあると思います。そのため、コードはコンパイルされているように見えますが、ライブラリの残りのオブジェクト コードが見つからないと、リンクしません。私は C++ にかなり慣れていないので、makefile についてはよくわかりませんが、Android NDK で使用されているものと一致する「標準」makefile は見たことがありません。明らかに多くの詳細を隠しています。私が正しく理解している場合、「標準の」メイクファイルでは、出力ファイルと必要なオブジェクトファイルに名前を付け、その後にオブジェクトファイルとそのソースファイルとヘッダーファイルなどを続けます.ndk-を強制する方法がわかりませんbuild を使用してオブジェクト コードを作成し、残りのライブラリをリンクします。

ここに私の現在の Android.mk があります:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := jni_vrpn_button
LOCAL_SRC_FILES := jni_vrpn_button.cpp

include $(BUILD_SHARED_LIBRARY)

jni_vrpn_button.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_VrpnButton */

#ifndef _Included_jni_VrpnButton
#define _Included_jni_VrpnButton
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jni_VrpnButton
 * Method:    vrpn_Button_initialize
 * Signature: (Ljava/lang/String;J)J
 */
JNIEXPORT jlong JNICALL Java_jni_VrpnButton_vrpn_1Button_1initialize
  (JNIEnv *, jobject, jstring, jlong);

/*
 * Class:     jni_VrpnButton
 * Method:    vrpn_button_mainloop
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_jni_VrpnButton_vrpn_1button_1mainloop
  (JNIEnv *, jobject, jlong);

#ifdef __cplusplus
}
#endif
#endif

jni_vrpn_button.cpp:

#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>

#include <jni_vrpn_button.h>
#include <vrpn_Button.h>
#include <vrpn_Connection.h>

/*
 * Class:     jni_VrpnButton
 * Method:    vrpn_Button_initialize
 * Signature: (Ljava/lang/String;J)J
 */
JNIEXPORT jlong JNICALL Java_jni_VrpnButton_vrpn_1Button_1initialize
  (JNIEnv * env, jobject, jstring n, jlong conn)
{
 const char* name = strdup(env->GetStringUTFChars(n, 0));
 vrpn_Button_Example_Server * serv = new vrpn_Button_Example_Server(name, (vrpn_Connection *) conn, 1, 1.0);
 return (long) serv;
}

/*
 * Class:     jni_VrpnButton
 * Method:    vrpn_button_mainloop
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_jni_VrpnButton_vrpn_1button_1mainloop
  (JNIEnv *, jobject, jlong ptr)
{
 ((vrpn_Button_Example_Server *) ptr)->mainloop();
}

アイデア?

編集:エラーを投稿するのを忘れました:

$ $CRYSTAX/ndk-build SharedLibrary : libjni_vrpn_button.so /cygdrive/c/Development/android-ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/string/obj/l ocal/armeabi/ objs/jni_vrpn_button/jni_vrpn_button.o: 関数 Java_jni_VrpnButton_vrpn_1Button_1 initialize': /cygdrive/c/Development/android-ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/string/jni/j ni_vrpn_button.cpp:18: undefined reference to 内 vrpn_Button_Example_Server::vrpn_Button_Example_Server(char const*, vrpn_Connection*, int, double)' collect2: ld が 1 つの終了ステータスを返しました make: *** [/cygdrive/c/Development/android- ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/s string/obj/local/armeabi/libjni_vrpn_button.so] エラー 1

4

1 に答える 1

3

他の cpp ファイルを追加するのを忘れたので、リンカーはシンボルを見つけることができません。vrpn_Button.cpp と vrpn_Connection.cpp を Android.mk に追加します。

LOCAL_SRC_FILES := \
    jni_vrpn_button.cpp \
    vrpn_Button.cpp \
    vrpn_Connection.cpp

Android に限らず、すべての makefile で同じです。

于 2010-09-21T10:08:16.687 に答える