小编rbc*_*bcc的帖子

从signed char转换为unsigned char并再次返回?

我正在使用JNI并且有一个jbyte类型的数组,其中jbyte表示为有符号字符,即-128到127.jbytes表示图像像素.对于图像处理,我们通常希望像素分量的范围为0到255.因此我想将jbyte值转换为0到255的范围(即与unsigned char相同的范围),对值进行一些计算然后存储结果再次作为jbyte.

如何安全地进行这些转换?

我设法让这段代码工作,其中一个像素值增加30但是被限制为255,但我不明白它是安全的还是可移植的:

 #define CLAMP255(v) (v > 255 ? 255 : (v < 0 ? 0 : v))

 jbyte pixel = ...
 pixel = CLAMP_255((unsigned char)pixel + 30);
Run Code Online (Sandbox Code Playgroud)

我很想知道如何在C和C++中做到这一点.

c c++ java-native-interface

59
推荐指数
1
解决办法
9万
查看次数

为多种体系结构生成优化的NDK代码?

我有一些Android的C代码,可以进行大量的低级数字运算.我想知道我应该使用哪些设置(例如我的Android.mk和Application.mk),以便生成的代码可以在所有当前的Android设备上运行,但也可以利用特定芯片组的优化.我正在寻找使用良好的默认Android.mk和Application.mk设置,我想避免使用#ifdef分支丢弃我的C代码.

例如,我知道ARMv7有浮点指令,一些ARMv7芯片支持NEON指令,默认ARM不支持这些指令.是否可以设置标志,以便我可以使用NEON,没有NEON的ARMv7和默认的ARM构建来构建ARMv7?我知道如何做后两者但不是全部3.我对我使用的设置持谨慎态度,因为我认为当前默认设置是最安全的设置以及其他选项有哪些风险.

对于GCC特定的优化,我使用以下标志:

LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops
Run Code Online (Sandbox Code Playgroud)

我检查了所有这三个加速了我的代码.还有其他我可以添加的常见内容吗?

我的另一个提示是将"LOCAL_ARM_MODE:= arm"添加到Android.mk以加快更新的手臂芯片(尽管我对这件事以及旧芯片上发生的事情感到困惑).

c java-native-interface android gcc android-ndk

53
推荐指数
2
解决办法
2万
查看次数

"无法实例化活动"错误

我的一个Android应用程序有大约100,000个用户,每周大约10次,我通过Google的市场工具向我报告以下异常:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.rebm.asp/org.rebm.asp.MainActivity}:
  java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753)
at android.app.ActivityThread.access$2500(ActivityThread.java:129)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2107)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2651)
... 11 more
Run Code Online (Sandbox Code Playgroud)

从在线搜索,此错误通常表示清单文件和正在使用的包名称有问题.但是,我无法在自己的设备或模拟器上重现此错误.我只通过市场工具知道这个错误.我可以得出的结论是,这是一个罕见的错误,因为我知道很多人正在使用该应用程序,没有一个评论表明它崩溃了.

有谁知道问题可能是什么或我如何诊断它?

java mobile android

27
推荐指数
2
解决办法
7182
查看次数

在Java和C之间发送int []

我在Android中有一些图像处理Java代码,它们作用于两个大的int数组.大多数时候,Java足够快,但我需要通过JNI和NDK使用C来加速一些操作.

我知道我可以将数据从int数组传递给C的唯一方法是使用ByteBuffer.allocateDirect创建一个新缓冲区,将数据复制到该缓冲区,然后使C代码作用于缓冲区.

但是,我无法看到任何方法可以在Java中操作此缓冲区中的数据,就像缓冲区是int []或byte []一样.例如,对新创建的缓冲区调用ByteBuffer.array()将失败.有没有办法让这项工作?

我的内存有限,想要减少我需要的阵列/缓冲区数量.例如,如果我可以使用IntBuffer.wrap(new int [...])创建缓冲区,然后直接用Java操作支持缓冲区的数组,那将是很好的但是我不能这样做因为似乎唯一的事情似乎是在这里为JNI工作的是ByteBuffer.allocateDirect.

有没有其他方法在C和Java之间来回发送数据?我可以以某种方式在C端分配内存并让Java直接发送数据到那里吗?

编辑:比较缓冲区使用与int []使用的基准:

int size = 1000;
IntBuffer allocateDirect = java.nio.ByteBuffer.allocateDirect(4 * size).asIntBuffer();
for (int i = 0; i < 100; ++i)
{
  for (int x = 0; x < size; ++x)
  {
    int v = allocateDirect.get(x);
    allocateDirect.put(x, v + 1);
  }
}

int[] intArray = new int[size];
for (int i = 0; i < 100; ++i)
{
  for (int x = 0; x < size; ++x)
  {
    int v = intArray[x]; …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface android android-ndk

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

Android设备的压力敏感度有多受支持?

我想编写一个应用程序来响应用户手指施加的压力.具体来说,我想用它来改变被绘制线条的粗细.我很高兴只对应用于屏幕的手指表面区域做出反应.

MotionEvent.getSize()和MotionEvent.getPressure()函数看起来正是我想要的,但没有提及它们的准确性或它们的返回值的含义.在大多数Android设备上,这些方法的返回值是否足以满足我的需求?

我很好奇为什么没有流行的Android应用程序利用压力敏感性.我发现很少有文章提到这些方法,并且只发现讨论设备特定错误的帖子:http: //groups.google.com/group/android-porting/browse_thread/thread/7e8b1bb77dc7d82d

mobile android interface touch

12
推荐指数
1
解决办法
3199
查看次数

使用内存映射文件作为交换文件?

我在Android中工作,内存有限,并且没有类似功能的交换文件.我已经读过人们已经在他们的应用程序中使用内存映射文件实现了交换文件的功能,但我不明白这是如何工作的.有人知道吗?

我认为一般的想法是,如果我的程序想要使用大小为20Mb的int数组,我可以在20Mb文件中为该数组创建数据,然后使用内存映射文件功能透明地将其带入内存我当前需要读取和写入的文件部分.关键因素是,虽然我有20Mb的空间可读/写,但一次只有一小部分内存(Android应用程序仅限于~24Mb的内存).

我更喜欢在Java中工作,但C解决方案也可以.

编辑:这里提到了这个内存映射文件技巧,但我不明白它是如何工作的http://grammerjack.blogspot.com/2009/10/gles-quake-port-of-quake-to-android.html

c java java-native-interface android android-ndk

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

调用onPause时保存大量数据?

对于我的应用程序,我有大约15Mb(可以压缩一些处理能力到大约5Mb)的音频+视频+图像数据,我需要保存到磁盘.例如,我需要在用户通过电话中断(因为活动可能在此之后被杀)以及用户离开应用程序时保存此项.

如果我不压缩它,我可以在大约10秒内将数据保存到SD卡,如果我压缩它,我可以将它保存到SD卡,我希望它压缩.当调用onPause时,我有什么选项可以保存我的数据,这样我可以确定数据已经保存了?

从一些基本实验中,如果onPause在5秒后没有完成,我的活动就会被杀死.我有一些想法:

  1. 在onPause中启动一个新线程并在那里保存数据.这似乎工作正常,但似乎是我不应该做的事情.

  2. 启动服务,以某种方式将数据复制到服务(这会很慢吗?)然后获取服务以保存数据.我认为这会在手机顶部放置一个通知图标,但我不认为用户在这里看到"保存数据..."任务是不可思议的.

  3. 我可以快速将数据放入SQL数据库中,然后在用户返回应用程序后保存吗?

(由于应用程序的性质,我实际上没有任何实际的方法可以保存数据,因为用户可以通过耗时的操作以破坏性方式转换数据(例如,某些操作需要10秒).即使我存储了原始数据和为重新创建数据而执行的操作列表,用户在下次启动应用程序时必须等待一两分钟才能处理此数据.)

java android

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

其他线程中的IO操作阻塞了我的UI线程?

因此,IO不会阻止我的Android应用程序中的UI线程,我正在尝试将文件写入操作移动到单独的线程中.这是我用来启动低优先级线程从代码缓冲区写入1Mb的代码:

Thread t = new Thread(new Runnable()
{
  @Override
  public void run()
  {
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
      try
      {
        FileOutputStream fos = new FileOutputStream(filename));
        try
        {
          final java.nio.channels.FileChannel outChannel = fos.getChannel();
          outChannel.write(byteBuffer);
          fos.getFD().sync();
        }
        finally
        {
          if (fos != null)
            fos.close();
        }
      }
    catch (Exception e)
    {
      e.printStackTrace();
    }
}
});

t.setPriority(Thread.MIN_PRIORITY);
t.start();
Run Code Online (Sandbox Code Playgroud)

当某些UI事件发生时,这些线程在我的应用程序中启动.不幸的是,我有时会注意到大量的滞后.我的UI将每10个左右冻结约2秒钟,我开始/完成上述线程之一.如果我注释掉线程代码,这些延迟就会消失.

我该怎么做才能阻止这个IO操作阻止我的UI线程?

我不知道现在要做什么来诊断问题.我的理解是,当"outChannel.write"发生时,IO线程将被阻塞,因为它正在等待IO操作完成,这意味着我的UI线程将立即接管.是否这种情况下写操作实际上需要大量CPU功率?

编辑:

使用StrictView(我确定因为它在我首先修复的UI线程中发现了一些无关的IO问题),我可以确认我的IO线程中没有IO.

运行traceview的结果非常令人费解.UI问题是,当我执行拖放操作时,每10次左右我执行此操作,设备似乎冻结约0.5到1秒.你拖动的东西会冻结,延迟后最终会跳到你手指的位置.在traceview中,我一直拖拉,直到发生这种情况.对于在traceview中发生这种情况的情况,我的后台线程没有运行,但是突然阻塞了大约1秒,我的UI线程上通常快速调用的操作大约需要花费x10来执行.例如,对.drawBitmap(具有固定大小的位图)的调用显示为每次执行~0.2s时执行相同的.drawBitamp调用占用此时间的十分之一.我可能只是读错了,但我不知道从这里去哪里或者寻找什么.

java file-io mobile android

3
推荐指数
1
解决办法
3216
查看次数

标签 统计

android ×7

java ×5

c ×4

java-native-interface ×4

android-ndk ×3

mobile ×3

c++ ×1

file-io ×1

gcc ×1

interface ×1

touch ×1