修改-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" />
这是我的应用包
的屏幕截图
它在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
文件夹
它在iOS中运行良好。
我曾尝试在cocos2dx 2.2.2中创建新的应用程序并且它的工作完美但我的应用程序是在cocos2d-2.0-x-2.0.3中我无法将整个代码转换为cocos2dx 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文件
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();
}
*/
}