Kompilace velký C ++ knihovnu do Android NDK pomocí JNI - Makefile otázky

hlasů
2

Snažím se sestavit C ++ knihovny (VRPN) s několika Java obalů, které mají být použity v aplikaci pro Android. Příkazem NDK-build, dostanu chybu „nedefinovaný odkaz na“ první linii mého C soubor rozhraní ++, který odkazuje na konstruktor objekt v knihovně. Jsem si docela jistý, můj kód je správný - hovor odpovídá záhlaví metody a mám oba soubory záhlaví a zdrojové ověřit, že je implementována. Myslím, že problém je s mým souborem Android.mk, který v současné době odkazuje pouze na můj jednu třídu. Takže se objeví kód kompilovat, ale nebude odkazovat jakmile se nenajde objektový kód pro zbytek knihovny. Jsem do C ++ poměrně nová, takže nevím, hodně o makefiles, ale žádný ze „standardních“ makefiles, které jsem viděl zápas až na ty, které používá Android NDK, který zřejmě zakrýt spoustu detailů. Pokud chápu správně, ve „standardní“ makefile, jsem prostě název výstupního souboru a který objekt soubory, které potřebuje, následuje soubory objektů a jejich zdrojové a hlavičkové soubory, atd atd. Nevím, jak přinutit ndk- stavět vytvořit objektový kód a propojit zbytek knihovny.

Tady je můj současný 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();
}

Nápady?

Edit: Zapomněl post došlo k chybě:

$ $ CRYSTAX / NDK-build SharedLibrary: libjni_vrpn_button.so / cygdrive / c / Vývoj / android-NDK R4-windows-crystax-4 / android-NDK-r4-crystax / zdroje / string / obj / l Ocal / armeabi / objs / jni_vrpn_button / jni_vrpn_button.o: Ve funkci 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_Serve r (char const * vrpn_Connection *, int, double)‘collect2: ld vrátil 1 exit status make: *** [/ cygdrive / c / Vývoj / platformách Android NDK-r4-Windows crystax-4 / android-NDK-r4-crystax / zdroje / s Tring / obj / local / armeabi / libjni_vrpn_button.so] Chyba 1

Položena 20/09/2010 v 23:36
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
3

Asi jsem zapomněl přidat další CPP soubory, takže linker není schopen najít znak. Takže přidat vrpn_Button.cpp a vrpn_Connection.cpp do svého Android.mk:

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

Je to stejné pro všechny makefiles, tedy není omezen na Android.

Odpovězeno 21/09/2010 v 11:08
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more