Tag: android ndk

Android NDK套接字connect()在3g时失败时返回0

我在android NDK中编写了一个套接字,在c中编写了一个服务器。 它能够很好地连接到服务器。 但是,如果服务器已关闭或我尝试将其连接到另一个随机IP,则当它应返回-1时,对connect的调用仍会返回0。 以下是客户端的代码: #include #include #include #include #include #include #include #include #define APPNAME “MyApp” #define logcat(…) __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, __VA_ARGS__) int createSocket() { int sockFD; if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { logcat("Unable to create socket"); return -1; } logcat("Socket created: %i", sockFD); return sockFD; } JNIEXPORT jint JNICALL Java_myapp_client( JNIEnv* env, […]

Android如何增加ffmpeg mp4的性能?

我已经检测到函数avcodec_decode_audio3在mp4格式下运行缓慢,这里是解码音频的代码周期: while (av_read_frame(av_format_context, &packet) >= 0 && is_play == 1) { if (av_codec_context->codec_type == AVMEDIA_TYPE_AUDIO && is_play == 1) { int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; int size = packet.size; int n; int dataLength = size; int decoded = 0; while (size > 0) { //start measure time gettimeofday(&tvBegin, NULL); int len = avcodec_decode_audio3(av_codec_context, (int16_t *) pAudioBuffer, […]

在Android Studio中使用预构建的共享库

我需要在我的android项目中使用自定义的预建共享库(在独立的ndk上构建为libdynamic.so)。 我在路径src / main中创建了一个文件夹“jniLibs”,然后在其中创建了4个文件夹,即“armeabi”“armeabi-v7a”“x86”“x86_64”。 我已将预构建的库放在所有这4个文件夹中。 现在从我的本机代码我想调用这个库的一个函数。 按以下方式(在cmakelists.txt中包含标题): extern “C” JNIEXPORT jstring JNICALL Java_demo_co_ru_jnilibtest_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { float inv = rsqrt(3); //FUNCTION FROM LIBRARY (libdynamic.so) std::string hello = “Hello “; return env->NewStringUTF(hello.c_str()); } 我收到以下错误: Error:error: cannot find -ldynamic Error:(19) undefined reference to ‘rsqrt(float)’ Error:error: linker command failed with exit code 1 (use […]

为什么FreeImage以BGR格式加载图像?

我使用Android NDK和FreeImage库编写游戏,将图像加载到我的游戏中。 它以BGR格式加载图像。 可以加载RGB格式吗? 或者我需要手动交换R和B组件? 编辑 我的设备是三星Galaxy S4(armv7 archtecture)。 这是代码` FIMEMORY* fiStream = FreeImage_OpenMemory((BYTE*)data, size); FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiStream); if (FreeImage_FIFSupportsReading(fif)) { dib = FreeImage_LoadFromMemory(fif, fiStream, 0); } if (!dib) return; data_ = FreeImage_GetBits(dib); width_ = FreeImage_GetWidth(dib); height_ = FreeImage_GetHeight(dib); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width_, height_, 0, GL_RGB, GL_UNSIGNED_BYTE, data_ );

jni – 将int 转换为jobjectArray并将其返回给java

我想在c中创建一个新数组,保持原始数组加倍。 这是我的c代码,它编译但应用程序崩溃: #include JNIEXPORT jobjectArray JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr) { int i,j, sum = 0; jsize width = (*env)->GetArrayLength(env, arr); int array[2][2]; for (i=0; iGetObjectArrayElement(env, arr, i); int height = (*env)->GetArrayLength(env, line); jint *pos = (*env)->GetIntArrayElements(env, line, 0); for (j=0; jReleaseIntArrayElements(env, arr, pos, 0); } return array; } 主要java代码: package com.example.jninew; import […]

如何在C中使用’mmap’命令分配特定的内存区域? (Android NDK)

在C中使用’mmap’分配特定内存区域的正确方法是什么? 我已阅读/ proc / self / maps以确定该区域是否可用。 我尝试了以下内容,但在尝试写入分配的内存时崩溃了: // rdram is defined in header as: #define rdram ((unsigned int *)0x80000000) printf( “rdram=0x%x”, (int)rdram ); printf( “munmapping” ); munmap ((void*)0x80000000, 0x800000); printf( “mmapping” ); if(mmap ((void*)0x80000000, 0x800000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) <= 0) { printf( "mmap(0x80000000) failed" ); } else […]

无法使用android ndk灰显图像

我是android ndk的新手。我已经开始通过ruckus和IBM博客学习图像处理示例。 我想要弄清楚一个图像。 这是我正在使用的代码 显示的布局的xml文件 而java代码是 package com.example; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class GrayClass extends Activity { private ImageView imageView; private Bitmap bitmap; private Button button; private Bitmap original; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gray); original = BitmapFactory.decodeResource(getResources(), R.drawable.wallace); bitmap […]

C / Renderscript / Neon内在函数之间的电池功耗 – video滤波器(Edgedetection)APK

我使用Android NDK(使用C ++ API for Renderscript)开发了3个C / RS / Neon-Intrinsics版本的video处理算法。 来自JAVA前端的NDK侧的C / RS / Neon调用将进入Native级别。 我发现由于某些原因,与C和RS版本相比,Neon版本消耗大量功率。 我使用Trepn 5.0进行功率测试。 有人可以澄清一下这些方法C,Renderscript – GPU,Neon Intrinsics的功耗水平。 哪个消费最多? 什么是RS代码的理想功耗水平?,因为GPU以较低的时钟频率运行,功耗必须更低! Renderscript API是否专注于功耗优化? video – 1920×1080(20帧) C – 11115.067 ms(0.80mW) RS – 9867.170毫秒(0.43mW) Neon Intrinsic – 9160毫秒(1.49mW)

如何在C(Android NDK)中杀死子线程?

在你告诉我我不应该杀死线程然后发送信号/设置一个标志让他们作出反应之前,让我解释一下这个场景: 我正在使用OpenSL API在Android NDK中开发音频播放器(播放本地mp3文件),但Android实现有一个错误,如果我对文件重复执行搜索操作,该线程可悲地挂起一种内部死锁当我尝试释放资源时(SLObjectItf-> Destroy)。 所以我将destroy例程移动到子线程并等待一段固定的时间让它完成,如果没有,我认为该线程被挂起并继续执行泄漏一些资源,这比不得不去系统设置并手动终止应用程序。 我尝试使用信号SIGTERM和SIGKILL来杀死使用pthread_kill的子线程,但它似乎都终止了我的整个应用程序并且Android重新启动它。 我不能使用pthread_cancel,因为线程被绞死,Android NDK也不支持该方法。 有没有办法杀死子线程而不杀死整个应用程序? 编辑:这是线程和启动它的代码 static void *destroyDecoderInBackground(void *ignoredArgument) { if (decoderObject != NULL) { __android_log_print(ANDROID_LOG_INFO, “OpenSLES”, “Destroying decoder object”); (*decoderObject)->Destroy(decoderObject); __android_log_print(ANDROID_LOG_INFO, “OpenSLES”, “Decoder object destroyed”); decoderObject = NULL; decoderPlay = NULL; decoderSeek = NULL; decoderBufferQueue = NULL; } pthread_mutex_lock(&destroyDecoderLock); pthread_cond_signal(&destroyDecoderCond); pthread_mutex_unlock(&destroyDecoderLock); pthread_exit(0); } static void destroyDecoder(JNIEnv* env) { […]

Android和JNI实时时钟

我遇到了迷你Android应用程序的问题以及在C(JNI)函数中使用实时时钟信号。 看起来Android UI不喜欢来自C函数中实例化的定时器的实时信号。 在下面的PoC ,定时器每秒触发信号5次,如果在UI更新时触发信号,则应用程序崩溃。 如果我没有启动计时器=>没有崩溃 如果我没有在UI上放任何东西=>没有崩溃 我写了这个小PoC来certificate这种行为。 Java部分只是调用JNI函数并在屏幕上放置一个按钮。 public class MainActivity extends AppCompatActivity { Button bt; static { System.loadLibrary(“testtimer-jni”); } /* JNI ingresso */ public native void jniStartTimer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); jniStartTimer(); /* load button */ bt = new Button(getBaseContext()); setContentView(bt); } } 这是main.c文件的内容。 实例化并启动计时器。 每200ms (每秒5次cb()调用cb()函数。 #include #include #include […]