小编Ant*_*ony的帖子

Android Studio R.java

我看到旧设备发生故障,可以在多个新设备上运行:

android.content.res.Resources$NotFoundException: Resource ID #0x7f030035
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,你可以看看R.java看到罪魁祸首,但是在Android Studio中似乎并不存在.R.java在哪里可以关联该ID?

谢谢.

android r.java-file android-studio

13
推荐指数
1
解决办法
4万
查看次数

Android ndk嵌套模块

我有一个原生项目,在制作系统的挫折中,我通过简单地将所有代码堵塞在一起多年前就开始工作了.我试图将项目正确地移植到gradle-experimental,但这仍然是2.5年后的灾难.我现在正试图让Android.mk系统在重组(用于gradle-experimental)项目中工作.

这是组织:

  • jpeg(完全原生)
  • 处理器(完全原生,依赖于jpeg)
  • 库(jni,依赖于处理器和jpeg)

module
-jni (contains Application.mk, Android.mk)
-jpeg
--src
---main
----jni
-----Android.mk (and source co-located)
-processor
--src
----main
-----jni
------Android.mk
------/processor(source)
-library
--src
----main
-----java
-----jni
-----Android.mk (and source co-located)
Run Code Online (Sandbox Code Playgroud)

我知道如果我使用make文件,我可以将其弄平,但我想在2020年的某一天Android Studio将真正支持原生,所以我想我会保留当前的项目格式.

这是我的make文件:

模块/ JNI:

LOCAL_PATH := $(call my-dir)
STARTUP_DIR := $(LOCAL_PATH)

include $(STARTUP_DIR)/../jpeg/src/main/jni/Android.mk
include $(STARTUP_DIR)/../processor/src/main/jni/Android.mk
include $(STARTUP_DIR)/../library/src/main/jni/Android.mk

include $(CLEAR_VARS)
Run Code Online (Sandbox Code Playgroud)

JPEG/JNI:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_ARM_MODE := arm

LOCAL_SRC_FILES := [truncated]

LOCAL_CFLAGS += -DAVOID_TABLES
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
#LOCAL_CFLAGS += -march=armv6j

# enable tile based …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android android-ndk

11
推荐指数
1
解决办法
373
查看次数

float*从C到C#

我不是真正的CS家伙,所以如果你们这里的任何天才能指出我正确的方向,我将永远感激.

我有一个c-code命令行函数,用于将其结果写入文件.我将它转换为通过float*数组将其数据返回到类似的C++程序(以避免常量文件I/O):

float * mgrib(int argc, char **argv)
Run Code Online (Sandbox Code Playgroud)

这非常有效.我现在需要把它变成一个C#程序,这就是事情变得混乱的地方.

我做的第一件事就是避免使用char**来使争论成为一系列的bool.如果我允许它仍然转储到文件,这工作正常.

问题是在C#中使用c风格的float数组.在c-code中,它被分配了malloc.

所以这是我尝试过的一切都没有成功(我知道数组的大小):

  1. 制作一个"免费"函数导出到C#调用,以便在完成后释放内存.经过几次循环后,C#崩溃,没有任何警告.

  2. 使用Marshal.FreeCoTaskMem从C#释放malloc.结果相同.

  3. 将float*移动到参数并删除c代码malloc.(void mgrib(...,float*data,...)

__a)使用Marshal.AllocCoTaskMem分配它.使用Marshal.FreeCoTaskMem释放它.

__b)使用Marshal.Copy进行分配.使用Marshal.FreeCoTaskMem释放它(也许这是错的?)

我已经涉足了我能在网上找到的所有东西.如果需要更多信息,请告诉我.我希望这只是一个我想念的简单概念.

c c# malloc pointers marshalling

7
推荐指数
1
解决办法
4346
查看次数

托管C#中的免费非托管c代码内存

我有一个大型的c代码库,用于将其结果写入文件.我将它转换为通过float*数组将其数据返回到类似的C++程序(以避免常量文件I/O):

float* mgrib(...)
Run Code Online (Sandbox Code Playgroud)

这在c ++中运行良好,我可以"释放"内存.我设法通过以下方式将数据正确地导入C#:

IntPtr pointer = mgrib(...);
float[] result = new float[ size ];
Marshal.Copy( pointer, result, 0, size );
Marshal.FreeCoTaskMem( pointer );
Run Code Online (Sandbox Code Playgroud)

这是在循环内,因为必须从函数中提取许多字段.如果它少于256个字段,那么效果很好.如果它更多,它会在没有警告的情况下崩溃.如果我通过它正确运行文件然后运行另一个(总计超过256)它崩溃.我远不是CS专家,但256似乎不仅仅是巧合.

我很欣赏任何见解.谢谢.

c# memory unmanaged

7
推荐指数
1
解决办法
980
查看次数

无法原生调试

直到最近我才能使用本机调试功能.我一直在用java编写代码并回到本机代码,但现在我无法进行本机调试.它将运行并使用以前工作的调试配置,但是当它将附加时,我在启动时得到Null Pointer错误:

'启动[debug config]'遇到了问题.

"启动[调试配置]"期间发生内部错误.

显示java.lang.NullPointerException

该应用程序将在设备上运行,但不会遇到断点.有人看过这个,它让我疯了吗?

android adt android-ndk android-debug

5
推荐指数
1
解决办法
906
查看次数

UI线程上的AsyncTask不更新

我有一个AsyncTask更新ActionBarSherlock进度实现.不知怎的,onProgressUpdate虽然声称在UI线程上执行,却引发了一个线程错误.

protected void onProgressUpdate(Integer... values)
{
    setSupportProgress(values[0]);
}
Run Code Online (Sandbox Code Playgroud)

错误是:

03-06 00:13:11.672:E/AndroidRuntime(4183):at com.anthonymandra.framework.GalleryActivity $ ShareTask.onProgressUpdate(GalleryActivity.java:476)

只有创建视图层次结构的原始线程才能触及其视图.

据我所知,我应该访问UI线程...

我在我的应用程序中有很多工作AsyncTasks,但是根据要求这里是doInBackground(简化):

for (MediaObject image : toShare)
{
    BufferedInputStream imageData = image.getThumbStream();
    File swapFile = getSwapFile(...);
    write(swapFile, imageData);
    ++completed;
    float progress = (float) completed / toShare.size();
    int progressLocation = (int) Math.ceil(progressRange * progress);
    onProgressUpdate(progressLocation);
}
Run Code Online (Sandbox Code Playgroud)

user-interface android thread-safety android-asynctask

5
推荐指数
1
解决办法
1566
查看次数

Android proguard不完整的堆栈跟踪

我遇到了一个问题,即开发人员控制台中的堆栈跟踪与代码不匹配.行号显着关闭,并且必须在跟踪中的方法将不会存在于控制台的跟踪中.例如(简化的控制台跟踪):

at getBitmapSize
at getBitmapBytes
at onActivityResult
Run Code Online (Sandbox Code Playgroud)

但是在代码中它必须采用这条路径:

onActivitResult -> handleSaveImage -> getBitmapBytes -> getBitmapSize
Run Code Online (Sandbox Code Playgroud)

这段代码多年来没有变化,因此不需要使用错误的mapping.txt.以某种方式应用proguard是删除应用程序中的结构.那可能吗?它不会映射回来吗?

在转向proguard之前,我从未在堆栈跟踪中看到丢失方法.

还有什么我应该知道的关于让行号匹配?

我已经设定:

-keepattributes SourceFile,LineNumberTable
Run Code Online (Sandbox Code Playgroud)

这几乎是有效的.他们只是没有正确排队.

更新

我设置了一个测试,将NPE放在可预测的内联点上.

(优化)logcat错误具有正确的行号,并且仅为了清晰而分开的方法明显是行间的.通过正确的行号,一切都更加明显.

(未优化)获得相同的堆栈跟踪,除了跟踪中的其他方法.行号再次正确.

我不明白为什么开发人员控制台跟踪的行号错误,但这就是它难以理解的原因.它们不仅在一个文件中关闭,而且在所有文件中都关闭,因此它只是一个令人困惑的混乱,尤其是在您有多个异常处理(如i/o)的任何地方.

更新2

我将未经优化的应用程序提交到Play商店,现在堆栈跟踪排队.当你依赖Play堆栈跟踪时,我建议不要在复杂的应用程序中使用优化.

android proguard stack-trace

5
推荐指数
1
解决办法
679
查看次数

在onSaveInstanceState显示后无法执行此操作

我收到以下崩溃报告:

致命异常:java.lang.IllegalStateException:无法在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager)的android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1832)的onSaveInstanceState之后执行此操作. java:1850)在android.support.v4.app.BackStackRecord.com发布内部(BackStackRecord.java:643)android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:603)android.support.v4.app .DialogFragment.show(DialogFragment.java:143)

以下代码导致崩溃,为了清楚起见,我删除了一些简单的设置代码.我已经阅读了这个错误,据我所知,.show()在用户交互中应该是安全的onClick().我唯一能想到的是,这query()需要花费很长时间才能完成用户的交换.这是对这个错误的合理解释吗?即使使用大型数据库,它也会立即在我的设备上运行.还有其他可能吗?谢谢!

    foldersButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            final List<String> paths = new ArrayList<>();

            try(Cursor c = getActivity().getContentResolver().query(Meta.CONTENT_URI,
                    new String[]{"DISTINCT " + Meta.PARENT}, null, null,
                    Meta.PARENT + " ASC"))
            {
                while (c != null && c.moveToNext())
                {
                    String path = c.getString(c.getColumnIndex(Meta.PARENT));

                    // We place the excluded folders at the end
                    if (!mExcludedFolders.contains(path))
                        paths.add(path);
                }
            }

            [setup...]

            int[] position = new int[2];
            foldersButton.getLocationOnScreen(position);
            FolderDialog dialog = FolderDialog.newInstance(
                    paths.toArray(new String[paths.size()]), …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-dialogfragment onsaveinstancestate

5
推荐指数
2
解决办法
8260
查看次数

gradle-experimental:0.1.0 buildConfigField

有人知道如何buildConfigField在实验gradle插件中定义?

android.productFlavors {
    create("demo") {
        applicationId = 'com.anthonymandra.rawdroid'
        buildConfigField "String", FIELD_META, PROVIDER_META
    }
Run Code Online (Sandbox Code Playgroud)

得到:

错误:尝试读取为规则'model.android.productFlavors'提供的类型为'java.lang.Object'的模型的只写视图

android gradle build.gradle android-gradle-plugin gradle-experimental

4
推荐指数
1
解决办法
1007
查看次数

JNI:javah 破坏了内部类的参数

我有一个android.graphics.Bitmap$Config作为参数传递的 JNI 函数。 Config是 的内部类Bitmap。当我运行 javah 时,我得到了不正确的标头签名(截断为单个参数):

Landroid_graphics_Bitmap_Config
Run Code Online (Sandbox Code Playgroud)

这相当于:

Landroid/graphics/Bitmap/Config
Run Code Online (Sandbox Code Playgroud)

代替:

Landroid_graphics_Bitmap_00024Config
Run Code Online (Sandbox Code Playgroud)

这是等效的

Landroid/graphics/Bitmap$Config
Run Code Online (Sandbox Code Playgroud)

javah 生成的结果是错误的,因为 JNI 会在寻找内部类的_00024表示时抛出错误$。man forjavah似乎没有暗示任何设置来纠正这个问题。这只是限制javah吗?

c++ java java-native-interface android javah

4
推荐指数
1
解决办法
749
查看次数