0

编辑-2

终于修复了错误,请参阅下面的答案。

编辑-1

现在创建了一个新项目并将其导入 adt
并从 property->android->library 添加 src,
因为我添加了库它的编译,现在创建了 libcocos2dcpp.so 文件

并将其添加到 myapp.java 文件中

System.loadLibrary("cocos2dcpp");

运行它并将其安装在模拟器上,给出相同的错误

08-14 08:05:19.792: E/AndroidRuntime(1425): java.lang.UnsatisfiedLinkError: Native method not found: org.cocos2dx.lib.Cocos2dxHelper.nativeSetExternalAssetPath:(Ljava/lang/String;)V
08-14 08:05:19.792: E/AndroidRuntime(1425):     at org.cocos2dx.lib.Cocos2dxHelper.nativeSetExternalAssetPath(Native Method)

我正在使用 cocos2d-2.0-x-2.0.3
NDK -- android-ndk-r9d
ANDROID SDK -- android-19 使用 MAC OS -- 版本 10.9.4

通过导入项目将我的项目添加到 adt。

编辑 build_native.sh 并添加

# paths
NDK_ROOT="/Users/YourMacName/Documents/android-ndk-r9d"

在文件的开头。

我的 Android.mk 文件是

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/GamePlayScene.cpp \
                   ../../Classes/GameMenu.cpp \
                   ../../Classes/AEHero.cpp \
                   ../../Classes/Object.cpp \
                   ../../Classes/AEGroundElement.cpp \
                   ../../Classes/LevelGenerator.cpp \
                   ../../Classes/AEAirElement.cpp \
                   ../../Classes/AEGetShellEffect.cpp \
                   ../../Classes/AEPowerUp.cpp \
                   ../../Classes/EnemiesGamePlay.cpp \
                   ../../Classes/EnemyObject.cpp \
                   ../../Classes/AEGameManager.cpp \
                   ../../Classes/AEStoreMenu.cpp \
                   ../../Classes/AEMagnet.cpp  \
           ../../Classes/AEGroundElementNew.cpp  \
           ../../Classes/GameModeSelectionScreen.cpp  \
           ../../Classes/HowToPlay.cpp



LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes                   

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android) \
$(call import-module,cocos2dx) \
$(call import-module,extensions)

添加cocos2dx库属性->java构建路径->链接源->src

在 myApp.java 文件中添加此代码以加载 libgame.so 文件

static 
    {
        try 
        {
            System.loadLibrary("game");
        }
        catch (UnsatisfiedLinkError ule) 
        {
            Log.e("JNI", "WARNING: Could not load libgame.so");
        }
    }

在清单文件中添加了此代码

<!-- Tell Cocos2dxActivity the name of our .so -->
        <meta-data android:name="android.app.lib_name"
                   android:value="game" />

这是我的应用程序包的屏幕截图

在此处输入图像描述

它在 genymotion 模拟器和 android 设备错误消息弹出窗口上成功运行

Unfortunately, myApp has stoped.

LogCat 中的错误是

08-13 09:46:19.406: E/JNI(1320): WARNING: Could not load libgame.so
08-13 09:46:19.410: W/dalvikvm(1320): No implementation found for native Lorg/cocos2dx/lib/Cocos2dxHelper;.nativeSetApkPath:(Ljava/lang/String;)V
08-13 09:46:19.414: D/AndroidRuntime(1320): Shutting down VM
08-13 09:46:19.414: W/dalvikvm(1320): threadid=1: thread exiting with uncaught exception (group=0xa4b53648)
08-13 09:46:19.414: E/AndroidRuntime(1320): FATAL EXCEPTION: main
08-13 09:46:19.414: E/AndroidRuntime(1320): java.lang.UnsatisfiedLinkError: Native method not found: org.cocos2dx.lib.Cocos2dxHelper.nativeSetApkPath:(Ljava/lang/String;)V
08-13 09:46:19.414: E/AndroidRuntime(1320):     at org.cocos2dx.lib.Cocos2dxHelper.nativeSetApkPath(Native Method)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at org.cocos2dx.lib.Cocos2dxHelper.init(Cocos2dxHelper.java:63)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at org.cocos2dx.lib.Cocos2dxActivity.onCreate(Cocos2dxActivity.java:59)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at com.burninape.hobbitjetpackrunner.hobbit.onCreate(hobbit.java:106)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.Activity.performCreate(Activity.java:5133)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.os.Looper.loop(Looper.java:137)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at android.app.ActivityThread.main(ActivityThread.java:5103)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at java.lang.reflect.Method.invoke(Method.java:525)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-13 09:46:19.414: E/AndroidRuntime(1320):     at dalvik.system.NativeStart.main(Native Method)

我的问题是 libgame.so 文件是如何生成的?

libs我的文件夹中没有生成名为 libgame.so 的文件

它在 iOS 中运行良好。

我曾尝试在 cocos2dx 2.2.2 中创建新应用程序,它的工作完美,但我的应用程序在 cocos2d-2.0-x-2.0.3 中,我无法将整个代码转换为 cocos2dx 2.2.2,因为它太长了。

贴了很多赞,但没有给出解决方案,我尝试了很多,如果我得到了解决方案,我肯定会发布解决方案。

提前致谢。

4

2 回答 2

1

经过大量的工作终于得到了答案

多合一你必须运行命令 ./build_native.sh defore cocos2dx 2.2.2 来生成 .so 文件。

解决方案是 libgame.so 文件未创建

1)在build_native.sh中设置ndk路径

2)从终端运行命令./build_native.sh,得到错误
In constructor 'CocosDenshion::SimpleAudioEngine::SimpleAudioEngine()':
我不知道为什么但是NDK r9没有编译LOGDcpp文件所以我从那个文件中删除它。

3)再次运行命令./build_native.sh,结果是生成了libgame.so文件 在此处输入图像描述

4)从eclipse打开应用程序,现在一切正常。

于 2014-08-25T10:08:42.970 回答
0

你可以在这里发布你的jni文件吗?默认 cocos 示例库中的示例“main.cpp”。我猜测提供了错误的命名空间,因此 Android 无法找到正确的 JNI 方法。

 void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)
{
    if (!CCDirector::sharedDirector()->getOpenGLView())
    {
        CCEGLView *view = CCEGLView::sharedOpenGLView();
        view->setFrameSize(w, h);

        AppDelegate *pAppDelegate = new AppDelegate();
        pAppDelegate->setScreenId(screenId);

        delegate = pAppDelegate;
        CCApplication::sharedApplication()->run();
    }
    /*
    else
    {
        ccDrawInit();
        ccGLInvalidateStateCache();

        CCShaderCache::sharedShaderCache()->reloadDefaultShaders();
        CCTextureCache::reloadAllTextures();
        CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND, NULL);
        CCDirector::sharedDirector()->setGLDefaultValues(); 
    }
     */
}
于 2014-08-25T09:13:15.543 回答