为Android编译汇编代码

4
我发现了一篇由Vikram Aggarwal撰写的文章,讲述如何将汇编代码连接到Android的NDK中,其中还有一些示例代码展示了如何将C++代码与汇编代码连接起来。 (见http://www.eggwall.com/2011/09/android-arm-assembly-calling-assembly.html
我的问题是,我想使用同样的函数,但不是从JNI存根类调用它,而是从我的私有类调用我的汇编函数。
但在编译时,我收到以下错误:
error: 'armFunction' was not declared in this scope

有人尝试过这个或者有任何解决方法吗?
编辑:
Makefile:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := quake3

# I want ARM, not thumb.
LOCAL_ARM_MODE := arm    

LOCAL_SRC_FILES := \
    multiple.s \
    macros.h \
    math/Vector2.cpp\
    math/Vector3.cpp\
    math/plane.cpp\
    engine/frustum.cpp\
    engine/BoundingVolume.cpp\
    engine/camera.cpp\
    camera-proxy.cpp\

LOCAL_CFLAGS := -DANDROID_NDK \
                -DDISABLE_IMPORTGL \

LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
#LOCAL_LDLIBS := -llog -lGLESv2

APP_STL := gnustl_static
APP_CPPFLAGS := -S -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a

include $(BUILD_SHARED_LIBRARY)

在cpp文件中的函数调用:
void
Java_surreal_quake3_engine_Camera9_nativeGetDirection(JNIEnv* env, jobject thiz)
{
    //Camera* camera = (Camera*) env->GetIntField(thiz, pointerID);

    // get the _Z as the Vector3 java object
    jfieldID vector_fID = env->GetFieldID(cls, "_Z", "Lsurreal/libs/math/Vector3;");
    jobject vector_obj = env->GetObjectField(thiz, vector_fID);

    // call the setter methods on the _vecEye
        //jclass vectorClass = env->FindClass("surreal/libs/math/Vector3");
    jmethodID vector3_set = env->GetMethodID(vector3Class, "set"/*method-name*/, "(FFF)V" /*method-signature*/);
    env->CallVoidMethod(vector_obj, vector3_set, camera->getZ().x, camera->getZ().y, camera->getZ().z);

    int result = armFunction();
}

嗨,Binyamin, 我只是想在已编译的ndk项目中包含相同的multiple.s汇编文件。我将multiple.s文件复制到jni文件夹中,我的Android.mk文件如下(http://pastie.org/3919681)。现在,在函数末尾调用armFunction()以从已运行的c++代码中调用它(请参见http://pastie.org/3919661)。 - revolutionary
看了你的代码,似乎我的旧答案仍然适用,所以我将其恢复了,请查看。 - MByD
看起来就是这样,参见这里的最后一行:http://pastie.org/3919661 - MByD
相关:https://dev59.com/SlXTa4cB1Zd3GeqP13Uj - Ciro Santilli OurBigBook.com
1个回答

1

从类的代码来看,似乎你调用了这个函数,但我看不到任何声明,所以它无法被识别。因此,在调用函数之前(在C++类中),您需要有一个函数原型的声明:

像这样:

int armFunction(void); // << declaration

void Java_surreal_quake3_engine_Camera9_nativeGetDirection(JNIEnv* env, jobject thiz)
{
    // snip - snap
    int result = armFunction(); // << your function call
}

好的,当我在我的jni-c++存根类中制作这个函数的原型时,如果我从同一个存根类中调用我的汇编函数,例如jni/camera-proxy.cpp文件,我可以让事情编译通过。但是我想从我的私有c++类文件中调用我的汇编函数,例如jni/engine/private.cpp。 - revolutionary
兄弟,参数的数量是无关紧要的。它根本找不到函数定义。我将我的函数调用保持与原型相同。现在的问题是,当我尝试从私有类内部调用相同的函数时,它不起作用并且会出现相同的错误。但我仍然可以从JNI类中调用它... - revolutionary
D:\Development\Workspace\Quake3\Quake3/jni/engine/frustum.cpp:279: 对 `armFunction()' 的引用未定义 - revolutionary
1
嗨,Binyamin,谢谢,那就是方法。我创建了一个单独的头文件,并在extern C中编写了我的汇编函数声明。现在似乎可以工作了,它可以编译和执行。请参阅http://pastie.org/3922622 - revolutionary
嗨Binyamin, 我有一个新的问题,我已经在这里发布了(http://stackoverflow.com/questions/10662334/pass-parameters-from-c-to-assembley-in-android),请看一下。 我需要从我的C++函数传递超过四个参数到汇编。谢谢。 - revolutionary
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接