java - System.loadLibrary() 在某些情况下不工作

标签 java android c++ android-ndk

我正在制作一个 cocos2d-x 游戏,我遇到了一些奇怪的行为,我不确定它是否正常或正在发生什么,但这是正在发生的事情,所以 AppActivity.java 类扩展了 Cocos2dxActivity.java 类。我不必在我的 AppActivity.java 类中调用 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__)

为什么当我声明一个普通的 native 字符串时它可以工作,但是当我在字符串声明中使用该方法时却找不到该方法?

我能够通过在我的 AppActivity 类中调用它来解决这个问题,但我觉得它应该可以工作,而不必在我的 appActivity 中调用 loadLibrary 类,因为它已经在 Cocos2dxActivityappActivity extends Cocos2dxActivity 中被调用了?感谢你们能给我的任何帮助

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

最佳答案

那是因为您的 Activity 在其 onCreate() 的早期调用了 super.onCreate()只是为了说清楚:应该这样调用它,你没弄错。

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

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

最重要的是,您可以将 ami 字段的初始化移动到 AppActivity.onCreate() 中,如果您喜欢这种方式,或者您可以使用 如果您愿意,可以在 AppActivity 中使用 static block 。最终用户不会真正注意到差异。

关于java - System.loadLibrary() 在某些情况下不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55937721/

相关文章:

android - jsqmessagesviewcontroller 像优雅的安卓消息库

c++ - 我如何专门化这个模板成员函数?

c++ - 在不运行全局静态对象的析构函数的情况下离开 C++ 应用程序

java - 拉普拉斯金字塔产生奇怪的结果?

java - 你如何将其格式化为字符串

android - 以编程方式更改小部件布局

android - 所有 Activity 的自定义工具栏未按预期工作?

c++ - 使此 C++ 代码通用

java - IntelliJ 不允许我运行 Java 代码,将文件上传到 git 存储库后 src 文件夹不是蓝色的

java - 使用扩展接口(interface)参数实现方法