3

アセンブリコードをAndroidのNDKにリンクすることについて説明している、Vikram Aggarwalの記事を見つけました。この記事には、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();
}
4

1 に答える 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
}
于 2012-05-12T06:26:03.667 に答える