我正尝试编译一个C++库(VRPN),其中有一些Java包装将用于Android应用程序。使用ndk-build命令,我的C++接口文件的第一行出现“未定义引用”错误,它引用库中对象的构造函数。我相当确定我的代码是正确的 - 调用匹配方法头,并且我有头文件和源文件来验证它是否被实现。我认为问题出在我的Android.mk文件上,该文件目前只引用了我的单个类。因此,代码似乎可以编译,但一旦无法找到库的其余部分的对象代码,就不会链接。我对C++相当陌生,所以对makefile不太了解,但是我所见过的任何“标准”makefile都不符合Android NDK使用的那些,这显然隐藏了很多细节。如果我理解正确,在一个“标准”makefile中,我只需简单地命名输出文件和它需要的对象文件,然后是目标文件及其源文件和头文件等等。我不知道如何强制ndk-构建以创建目标代码并链接库的其余部分。使用JNI将大型C++库编译为Android NDK -makefile问题
这里是我当前的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: In function
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 returned 1 exit status make: *** [/cygdrive/c/Development/android-ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/s tring/obj/local/armeabi/libjni_vrpn_button.so] Error 1
这就是语法。谢谢! – erock2112 2010-09-22 12:51:39