【问题标题】:java.lang.UnsatisfiedLinkError: Native method not found: org.cocos2dx.lib.Cocos2dxHelper.nativeSetApkPath:java.lang.UnsatisfiedLinkError:未找到本机方法:org.cocos2dx.lib.Cocos2dxHelper.nativeSetApkPath:
【发布时间】:2014-08-13 10:14:13
【问题描述】:

Edit-2

终于解决了这个错误,请看下面我的回答。

Edit-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 操作系统 -- 版本 10.9.4

通过 Import project 将我的项目添加到 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");
        }
    }

在 Manifest 文件中添加此代码

<!-- 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,因为它太长了。

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

提前致谢。

【问题讨论】:

  • 你试过在控制台运行 build_native.sh 脚本吗?
  • 感谢您的回复,尝试并得到一个错误 - sudo: ./build_native.sh: command not found.

标签: android eclipse android-ndk cocos2d-x native-methods


【解决方案1】:

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

你必须在 cocos2dx 2.2.2 之前运行命令 ./build_native.sh 生成 .so 文件。

解决办法是 libgame.so 文件没有创建

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

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

3) 再次运行命令 ./build_native.sh 结果是生成了 libgame.so 文件

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

【讨论】:

    【解决方案2】:

    你可以在这里发布你的 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(); 
        }
         */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多