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

System.loadLibrary() not working in some instances

我正在制作一个 cocos2d-x 游戏,我遇到了一些奇怪的行为,我不确定它是否正常或发生了什么,但这是正在发生的事情,所以 AppActivity.java class扩展 Cocos2dxActivity.java class。我不必在 AppActivity.java class 中调用 System.loadLibrary("MyGame");,因为它是在 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 class 中调用它来解决这个问题,但我觉得它应该可以工作而不必在我的 appActivity 中调用 loadLibrary ] class 因为它已经在 Cocos2dxActivityappActivity extends Cocos2dxActivity 中被调用了?感谢你们能给我的任何帮助

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

您似乎试图在本机库尚未加载时调用本机函数。

那是因为您的 activity 在 onCreate() 的早期调用了 super.onCreate()澄清一下: 应该这样称呼,你没弄错。

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

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

底线,你可以把ami字段的初始化移动到AppActivity.onCreate(),如果你喜欢这样,或者你可以使用static如果您愿意,可以在 AppActivity 中阻止。最终用户不会真正注意到差异。