java.lang.UnsatisfiedLinkError:找不到本机方法:org.cocos2dx.lib.Cocos2dxHelper.nativeSetApkPath:

时间:2014-08-13 10:14:13

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

修改-2

最后修正了错误,请参阅我的回答。

编辑-1

现在创建一个新项目并将其导入到adt
并从property-> android->库中添加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文件中为load 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" />

这是我的应用包

的屏幕截图

enter image description here

它在genymotion emmulator和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因为它也是长。

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

提前感谢。

2 个答案:

答案 0 :(得分:1)

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

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

sollution是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文件 enter image description here

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

答案 1 :(得分:0)

你可以在这里发布你的jni文件吗?例子&#34; main.cpp&#34;在默认的cocos示例库中。 我猜测提供的命名空间错误,因此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(); 
    }
     */
}