System.loadLibrary()在某些情况下不起作用

时间:2019-05-01 14:19:24

标签: java android c++ android-ndk

我正在制作cocos2d-x游戏,并且遇到一些奇怪的行为,不确定其是否正常或正在发生什么,但这是正在发生的事情,因此AppActivity.java类扩展了Cocos2dxActivity.java类。我不必在System.loadLibrary("MyGame");类中调用AppActivity.java,因为它在Cocos2dxActivity.java中被调用。但是,如果我做这样的普通声明,就会发生这种情况

private native String invokeNativeString();

一切正常,但随后我尝试直接在下面声明它,并且收到此错误

String ami = new String(invokeNativeString());

出现错误:

05-01 09:11:27.250 10135-10135/com.izzyjmachado.spaceball E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.izzyjmachado.spaceball, PID: 10135
        java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String org.cocos2dx.cpp.AppActivity.invokeNativeString() (tried Java_org_cocos2dx_cpp_AppActivity_invokeNativeString and Java_org_cocos2dx_cpp_AppActivity_invokeNativeString__)

为什么当我声明一个普通的本地字符串时却起作用,但是当我在字符串的声明中使用该方法时却找不到该方法吗?

我能够通过在我的AppActivity类中调用此命令来解决此问题,但是我认为它应该不必在我的loadLibrary类中调用appActivity,因为它已经存在在Cocos2dxActivityappActivity extends Cocos2dxActivity中调用?多亏你们能给我的帮助

static {
    System.loadLibrary("MyGame");
}

2 个答案:

答案 0 :(得分:3)

那是因为您的活动在super.onCreate()的早期调用了onCreate()只需说明一下:这就是应如何调用,您没有记错。

但是。 。Cocos2dxActivity作者选择在onCreate()期间加载本机库。他们有充分的理由做出此决定:允许他们从您的程序包中提取 android.app.lib_name ,并通过这种方式选择正确的库。

JNI教程通常建议在static {}块中加载本机库。后者是一种更安全的做法(例如,它可以解决字段初始化的问题),但它也有其自身的缺点。

最重要的是,如果您愿意,可以将 ami 字段的初始化移到AppActivity.onCreate()中,也可以在中使用static块> AppActivity (如果愿意)。最终用户不会真正注意到差异。

答案 1 :(得分:1)

似乎您试图在尚未加载本机库的情况下调用本机函数。