禁用JNI C代码中变量的编译器优化

时间:2018-12-10 02:40:08

标签: android c java-native-interface compiler-optimization

我在Android JNI C函数中有一个变量定义,该变量定义除了将自身定义为字符串外什么也不做。我希望此字符串出现在二进制文件中,但是当我构建项目时,.so文件不包含该字符串。

这就是我在C代码中尝试过的内容。

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_CreateEditAlertsWindow(object):
    def setupUi(self, CreateEditAlertsWindow): 
        self.alerts_window_cancel_button = QtWidgets.QPushButton(CreateEditAlertsWindow)
        self.alerts_window_cancel_button.setObjectName ("alerts_window_cancel_button")
        self.horizontalLayout_2.addWidget(self.alerts_window_cancel_button)

        # a bunch of other stuff

    def retranslateUi(self, CreateEditAlertsWindow):
        _translate = QtCore.QCoreApplication.translate
        self.alerts_window_cancel_button.setText (_translate("CreateEditAlertsWindow", "Cancel"))

        self.alerts_window_cancel_button.clicked.connect(self.closeWindow)

        # a bunch more stuff

def closeWindow(self):
    self.exit()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    CreateEditAlertsWindow = QtWidgets.QDialog()
    ui = Ui_CreateEditAlertsWindow()
    ui.setupUi(CreateEditAlertsWindow)
    CreateEditAlertsWindow.show()
    sys.exit(app.exec_())

如何使编译器无法优化未使用的变量定义?

1 个答案:

答案 0 :(得分:0)

我怀疑您的问题不是与编译有关,而是与链接有关。链接器通常会删除不使用的数据,以减小二进制文件的大小。要检查这一点,请在C文件生成的strings文件上使用.o命令或等效命令:如果字符串在其中,但不在.so中,则问题在于链接。

不幸的是,我不知道如何使用链接器命令解决此问题,因为我所有的Android C编程都是通过独立的工具链和自定义构建系统完成的。

您最简单的解决方案就是在运行时复制字符串。