我现在在做一个游戏的移植,以下是我程序里jni的简写版:
     |-----one.h
     |-----one.cpp
     |
jni--|-----two.h
     |-----two.cpp
     |              |---three.h
     |-----folder---|
                    |---three.cppone: 就是native方法,它要调用two的类的方法(include"two.h");two: 一个类,调用three里的方法(include"./folder/threee");three: 就是一系列的普通方法。我现在不大会写这个Android.mk文件,写过了几个试试都不成功,求大虾们的帮助。下面这个为什么不对?LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_MODULE := three
LOCAL_SRC_FILES := folder/three.cpp
include $(BUILD_STATIC_LIBRARY)include $(CLEAR_VARS)
LOCAL_MODULE := two
LOCAL_SRC_FILES := two.cpp
LOCAL_STATIC_LIBRARIES := three
include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
LOCAL_MODULE := one
LOCAL_SRC_FILES := one.cpp 
LOCAL_SHARED_LIBRARIES := two
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)谢谢了!!!PS:帖子写得不太好。假如还有更多的文件相互调用,写法会不会更麻烦?

解决方案 »

  1.   

    真得写得不好
    jin 文件夹里有四个文件(one.h, one.cpp, two.h, two.cpp)与一个文件夹(folder);folder里有两个文件(three.h, three.cpp)。
      

  2.   

    报什么错?试下这个。LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := libxxx
    LOCAL_SRC_FILES:= one.cpp \
              two.cpp \
              folder/three.cpp
    LOCAL_C_INCLUDES +=$(LOCAL_PATH)/folder
    LOCAL_LDLIBS := -llog
    include $(BUILD_SHARED_LIBRARY)
      

  3.   

    Android.mk只是指明如何编译,编译成so你的应用程序错误,是你代码有问题,Logcat报的是什么错?
      

  4.   

    改成你这样后,正常运行并且有正确的结果。看来我写Android.mk的很有问题...
      

  5.   

    解决就好了 出错了具体还要看logcat要不只能猜了..
      

  6.   

    INFO/dalvikvm(220): Unable to dlopen(/data/data/cn.gzjp.lmq/lib/libone.so): Cannot load library: link_image[1638]:    30 could not load needed library 'libtwo.so' for 'libone.so' (load_library[984]: Library 'libtwo.so' not found)
    WARN/dalvikvm(220): Exception Ljava/lang/UnsatisfiedLinkError; thrown during Lcn/gzjp/lmq/Test2;.<clinit>
    WARN/dalvikvm(220): Class init failed in newInstance call (Lcn/gzjp/lmq/Test2;)
    DEBUG/AndroidRuntime(220): Shutting down VM
    WARN/dalvikvm(220): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
    ERROR/AndroidRuntime(220): Uncaught handler: thread main exiting due to uncaught exception
    ERROR/AndroidRuntime(220): java.lang.ExceptionInInitializerError
    ERROR/AndroidRuntime(220):     at java.lang.Class.newInstanceImpl(Native Method)
    ERROR/AndroidRuntime(220):     at java.lang.Class.newInstance(Class.java:1472)
    ERROR/AndroidRuntime(220):     at android.app.Instrumentation.newActivity(Instrumentation.java:1097)
    ERROR/AndroidRuntime(220):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)
    ERROR/AndroidRuntime(220):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
    ERROR/AndroidRuntime(220):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
    ERROR/AndroidRuntime(220):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
    ERROR/AndroidRuntime(220):     at android.os.Handler.dispatchMessage(Handler.java:99)
    ERROR/AndroidRuntime(220):     at android.os.Looper.loop(Looper.java:123)
    ERROR/AndroidRuntime(220):     at android.app.ActivityThread.main(ActivityThread.java:4203)
    ERROR/AndroidRuntime(220):     at java.lang.reflect.Method.invokeNative(Native Method)
    ERROR/AndroidRuntime(220):     at java.lang.reflect.Method.invoke(Method.java:521)
    ERROR/AndroidRuntime(220):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    ERROR/AndroidRuntime(220):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
    ERROR/AndroidRuntime(220):     at dalvik.system.NativeStart.main(Native Method)
    ERROR/AndroidRuntime(220): Caused by: java.lang.UnsatisfiedLinkError: Library one not found
    ERROR/AndroidRuntime(220):     at java.lang.Runtime.loadLibrary(Runtime.java:489)
    ERROR/AndroidRuntime(220):     at java.lang.System.loadLibrary(System.java:557)
    ERROR/AndroidRuntime(220):     at cn.gzjp.lmq.Test2.<clinit>(Test2.java:20)
    ERROR/AndroidRuntime(220):     ... 15 more
      

  7.   

    应该是第一行的问题吧,为什么不能加载libtwo.so呢
      

  8.   

    是没找到libtwo 要把你编译出来的libtwo.so 也放在工程的libs/armeabi下编译
      

  9.   

    挺麻烦你的Compile++ thumb  : one <= one.cpp
    Compile++ thumb  : two <= two.cpp
    Compile++ thumb  : three <= three.cpp
    StaticLibrary  : libthree.a
    SharedLibrary  : libtwo.so
    SharedLibrary  : libone.so
    Install        : libone.so => libs/armeabi/libone.so
    Install        : libtwo.so => libs/armeabi/libtwo.so
      

  10.   

    这样是没错  再就要看/data/data/包名/lib下有没被解压出来