Android:从C++本地活动中调用Java类
Java代码: package local.ttt; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; public class Text2Bitmap { static Bitmap getBitmap(String text,int fontsize) { Paint paint=new Paint(); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.WHITE); paint.s
6 2024-04-09
编程技术问答社区
在c++中直接访问Android APK资产数据,无需资产管理器和复制
我在引擎中使用纯C ++在Android中创建游戏引擎.没有一个Java文件.基本上,这是一个仅存储在外部内存中的游戏.当我通过ADB手动移动资产数据到我的外部SD卡时,游戏的工作正常和稳定. adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/ 这不是一个好的解决方案,因为它无法交付.因此,我在资产文件夹中有资产数据 在构建过程中,哪个将移至APK文件,并具有以下结构: 资产/数据/MoreFolders/withsubfolders 资产/数据/ingineda.zip 资产/data/scriptData.zip ,但我不知道文件系统上的这些文件在哪里访问C ++代码. 所以我试图获取通往文件目录的路径.而且由于本机活动状态中的错误 我必须在普通代码中检索信息. // bug in 2.3 internalDataP
10 2024-03-02
编程技术问答社区
"dlopen: 在加载本地活动时出现 "无效参数"。
我正在使用以下引导代码来加载我的本机活动(JNGL测试): #include #include #include #include #include const std::string LIB_PATH = "/data/data/com.bixense.jngl_test/lib/"; void* load_lib(const std::string& l) { void* handle = dlopen(l.c_str(), RTLD_NOW | RTLD_GLOBAL); if (!handle) { throw std::runtime_error(std::string("dlopen(") + l + "): " + strerror(errno)); } return
14 2024-02-17
编程技术问答社区
仅通过本地代码检查apk中的目录(文件夹)是否存在
我需要检查APK中是否存在某个目录. android/asset_manager.h API似乎不一致 - 当AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode);未能打开文件时,它返回null,但是对于目录AAssetDir* AAssetManager_openDir(AAssetManager* mgr, const char* dirName);的实现,即使它在内部未能打开/,也始终返回a new AAssetDir(...)在APK中找到目录. AAssetDir是向前宣布的,并且它的实现被隐藏在.cpp文件中,否则(也许?/p> 我现在正在探索另一种选择 - 致电Java并做类似的事情: public static boolean folderExistsInApk(final String path){ AssetManager assetMa
62 2024-02-17
编程技术问答社区
安卓ndk数据保存/加载
我正在努力将PC OpenGL应用程序移植到Android上.我选择使用NDK android_native_app_glue框架.如我所知,它可以让我留在C ++上,并且不写任何单个Java代码行.听起来很有希望. 对我来说,第一个不清楚的事情是数据保存/加载.我的应用程序的数据格式是二进制文件,我的原始PC相关代码使用普通的" stdio.h"文件操作:fopen,fread,fwrite等,从" mygame.bin"文件中创建,写入和读取.如何将其移植到Android? 谷歌搜索了它,我发现我必须存储,然后使用" Java环境"变量: JNIEnv *g_jniEnv = 0; void android_main(struct android_app* state) { g_jniEnv = state->activity->env; } 但是,我仍然没有意识到如何使用此g_jnienv执行文件操作. 更新: 好的,我发现在Java中,可以节省
14 2024-02-17
编程技术问答社区
APP_CMD_WINDOW_RESIZED未被调用,但本地窗口被调整了大小
我有本机应用程序,该应用程序被配置为不破坏设备方向更改上的活动. 当设备方向更改仅触发本地生命周期命令之后的. /** * Command from main thread: the current device configuration has changed. */ APP_CMD_CONFIG_CHANGED 在命令处理程序中,我可以看到窗口大小已使用ANativeWindow_getHeight函数更改. (我知道ANativeWindow_getHeight函数不是在配置更改处理程序中使用窗口大小的最佳想法,我只需要检查窗口是否已调整大小.) 如果调整了本机窗口的大小,我想我应该触发按下本机命令
18 2024-02-17
编程技术问答社区
如何为Native Activity NDK应用程序启用全屏沉浸式模式?
在 system-ui/immersive.html 我似乎找不到有关如何在本机活动NDK应用程序(不使用JNI)中设置全屏沉浸模式的任何信息,因为似乎只能切换全屏沉浸式模式来自Java. 由于无法从清单( set android bumbersive android bumbersive fumperive android Immersive full fumper)清单中的屏幕模式),是否有任何方法可以通过EGL? 要求它 似乎是启用全屏沉浸模式的唯一方法是在通过EGL请求表面? 解决方案 回答我自己的问题,您可以通过C ++/JNI设置沉浸式模式,而无需在项目中添加Java.这是我的片段,大部分从互联网上的某个地方复制. auto portis::android_util::SetImmersiveMode(JNIEnv* env, android_app* iandroid_app) -> bool { PORTIS_ASSERT(iandroid_a
在使用本地活动时关闭软键盘时发生崩溃
我们正在为Android开发独立游戏,并希望用户选择他的昵称.我们选择使用NDK提供的本机活动,这似乎是最简单的方法. 我们在键盘上遇到的第一个问题是函数nativeactivity_showsoftinput()似乎根本没有任何作用(如-show-the-soft-keyboard-on-native-activity>在这里),因此我们使用JNI调用函数来提出键盘: static void showKeyboard(Activity activity) { String s = Context.INPUT_METHOD_SERVICE; InputMethodManager m = (InputMethodManager)activity.getSystemService(s); View w = activity.getWindow().getDecorView(); m.showSoftInput(w, 0); } 这可以很好地提高键盘,并且可以在
14 2024-02-17
编程技术问答社区
java.lang.IllegalArgumentException。无法加载本地库
我在项目中使用了纯粹的本地NDK(本机活动).当我在Android.mk文件中添加预构建的静态库时,它可以正常工作.但是,当我尝试链接预构建的共享库时,它显示以下例外: 03-27 16:42:09.982: E/AndroidRuntime(1275): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.irrlicht.example/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.irrlicht.example-1/libHelloWorldMobile.so 这是我的android.mk文件: .... include $(CLEAR_VARS) LOCAL_C_INCLUDES := /Us
8 2024-02-17
编程技术问答社区
从Android上的NativeActivity中打开/读取APK资产
我只能找到2010年及更早的解决方案.所以我想看看是否有更多最新的立场. 我想避免使用Java并纯粹使用C ++,以访问APK中存储的文件(比1MB少一些).使用AssetManager意味着我无法像其他每个操作系统(包括iOS)上的其他文件一样访问文件. 如果不是,在C ++中是否有一种方法,我可以以某种方式将fopen/fread映射到AssetManager API? 解决方案 我实际上找到了这个问题的优雅答案,在这里博客. 摘要是: AassetManager API具有NDK绑定.这使您可以从APK加载资产. 可以组合一组知道如何读/写入/寻求任何事物并伪装成文件指针(文件*)的功能. 如果我们创建一个以资产名称的函数,使用AssetManager打开它,然后将结果掩饰为文件*,那么我们的内容与Fopen非常相似. 如果我们定义了一个名为fopen的宏,我们可以用我们的所有功能替换该功能的所有用途. 我的博客有完整的写入,并且您需要在
20 2024-02-17
编程技术问答社区
在本地活动应用程序中出现 "无法找到本地库 "的错误
我的本​​地活动应用程序有一些问题.它在99%的设备上正常工作.但是有时用户会遇到以下错误: java.lang.RuntimeException: Unable to start activity ComponentInfo{nightradio.sunvox/nightradio.sunvox.MyNativeActivity}: java.lang.IllegalArgumentException: Unable to find native library: sundog at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095) at android.app.ActivityThread.access$600(Activit
8 2024-02-17
编程技术问答社区
如何使用NativeActivity向内部存储文件系统写入?
我正在将纯C ++游戏移植到Android上,并且由于我的目标是Android 3.0+平板电脑,因此我选择使用Nativeactitive,以完全避免Java.但是,我看不到任何功能,让我写入设备的内部存储.我不知道我应该编写哪个目录,并且内部存储文件系统无法访问 ,请访问Fopen()()失败. 此代码通常在Java上可以解决问题,为我提供了我应用程序内部写入数据目录的途径: mContext.getFilesDir(); 有人知道C ++的替代方案吗?否则,我将不得不用JNI致电上面的片段. 当然,我已经研究了 $ ndk/../include/android/em>标题,但我没有看到我需要的候选方法. 解决方案 我终于找到了它.事实证明,通往内部存储目录的路径被声明为 android/atnation_activity.h 中的nativeactitive的成员: /** * Path to this application's interna
12 2024-02-17
编程技术问答社区
在安卓ndk上的OpenGLES 1.1中带有GLSurfaceView模式的FrameBuffers
在Android NDK中,可以使OpenGL ES 1.1与典型的Java侧GlSurfaceView模式(glsurfaceview.renderer OndrawFrame,onsurfacececececreated等)一起使用,同时在C ++侧面框架,颜色和深度,颜色和深度,缓冲区和VBO? 我正在尝试使用以下方式创建它们: void ES1Renderer::on_surface_created() { // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer glGenFramebuffersOES(1, &defaultFramebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
26 2024-02-17
编程技术问答社区
使用C++和NativeActivity类获取Android APK的名称
我正在使用NDK和Nativeactitive编写Android应用程序.我的应用程序取决于几个被运送为资产的第三方代码.目前,我正在努力在保持文件夹结构完整时尝试提取这些资产. 我尝试使用AssetManager,但是为了保持文件夹结构完整,似乎涉及大量代码,对于我提到的简单任务.从那以后,我就切换了重点以尝试实现将APK作为ZIP文件,并以这种方式提取其内容.但这需要我找到通往APK的确切路径. 在普通的Android应用程序中,一个人将使用getPackageCodepath,但这是上下文类中附加的抽象方法.我的问题是,当不使用正常活动时,如何获得通往APK的确切路径? 还尝试通过JNI调用GetPackageCodepath,但由于无法找到该方法,该应用程序崩溃了. 编辑: 这甚至可能吗? 解决方案 我实际上可以通过JNI调用getPackageCodePath并使其工作.以下代码在NDK R7中的本机活动样本中放在android_main的顶部,
6 2024-02-17
编程技术问答社区
android dlopen()中的竞赛条件?
我的Android应用具有一个简单的"加载程序"纳入性,非常简单android_main(),它仅加载一个不同的共享对象并将其传递给它: typedef void (*Tandroid_main)( android_app*); void android_main( android_app* state ) { void* glib = dlopen("libmain.so", RTLD_NOW); void* fmain = dlsym(glib, "android_main"); Tandroid_main libmain = (Tandroid_main)fmain; libmain(state) } 这效果很好..大约一半的时间.其他时间,由于dlopen()失败并用errno = 2(没有这样的文件)返回null. 由于这种情况的奇怪矛盾,我怀疑是一个时机问题,实际上,在dlopen()之前添加了sleep(1),停止了它.比slee
8 2024-02-17
编程技术问答社区
如何在本地活动中使用一个共享库
我有一个具有本土活动的Android项目. 此本机活动使用一个名为" main"(libmain.so文件)的共享库进行启动. (使用NDK/样本/本机活动的代码) 此应用程序正常. "主"模块android.mk文件: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main LOCAL_SRC_FILES := main.cpp LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM LOCAL_STATIC_LIBRARIES := android_native_app_glue game include $(BUILD_SHARED_LIBRARY) $(call import-module,android/native_app_glue) 现在,我想添加"主"库使用的另一个共享库(例如游戏引擎). 我已经建立了一
4 2024-02-17
编程技术问答社区
如何将NativeActivity的内容视图设置为用Java创建的组件
是否有一种方法可以将纳入性的内容设置为Java中创建的组件(例如Framelayout,ImageView等)?我需要使用NativeaCtivity(用于在Xperia Play上获取触摸板输入),但是我还需要能够查看Java代码中创建的组件. 我尝试过覆盖otCreate命令并在那里调用setContentView,但是尽管没有丢弃任何错误,但它也没有做任何事情(显然是因为内容视图已经由本机代码设置为设置).是否有某种窗口ID或我可以传递给本机代码的内容,以说明内容视图应该是什么,或者可以在XML中以某种方式设置此内容以将NativeaCtivity的内容视图设置为我可以修改的组件来自Java? 让我知道您是否需要更多信息. 解决方案 我会在这里为其他问题的其他问题发布答案,因为我最终确实弄清楚了一种有效的方法. 在onCreate()方法中,如果要设置任何特定的窗口标志(famery_no_title,flag_flylscreen,flag_keep_s
14 2024-02-17
编程技术问答社区
不能在本地活动应用程序中加载有依赖关系的本地共享库
在我的Android应用中,我有4个库: libTemplate.so depends on libPorkholt.so libPorkholt.so depends on libpng15.so depends on liblua.so depends on libopenal.so libpng15.so liblua.so libopenal.so 如果我编写一个小命令行可执行文件,该可执行文件可链接使用libtemplate并手动调用AnativeActivity_oncreate,它将链接并运行良好(如果我指向ld_library_path,ld_library_path到/data/data/data/com.mycom.mycompany.mycompany.template/lib/lib) ) ) ) ) > 如果我运行我的应用程序,我会收到此非常有用的错误消息: E/AndroidRuntime(13214): j
24 2024-02-17
编程技术问答社区
我可以将NativeActivity与ActivityGroup一起使用吗?
我知道ActivityGroup已弃用. 但是我试图将NativeActivty的用户界面与一些Java/Android API Views. 我正在尝试制作一个混合用户界面,其中屏幕的一部分来自NativeActivity. 我使用了此示例 并尝试了一些简单的活动. 这个与任何Activity完美搭配(即使我使用视频播放视频). 但是当我尝试加载NativeActivity时,它不起作用. (我尝试了 通过"不工作",我的意思是window.getDecorView()从本机活动中它总是返回透明视图,而不是实际的内容视图. 我应该怎么做?请帮助我. 解决方案 这次我找到了解决方法,而且工作正常.但仅用于NDK演示. 在您的ActivityGroup子类中,编写以下代码. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst
10 2024-02-16
编程技术问答社区
本地活动没有完成
我称其为javaActivity的分泌性.我的分离性的入口点是 android_main(struct android_app* state) 在此结束时,我致电 ANativeActivity_finish 但是,我的本地活动只是悬挂,而不是返回称为它的Java活动(简单地使用startActivity).似乎处于暂停状态.我返回上一个活动的唯一方法是在我的android_main结束时致电exit(0),但是这会杀死该过程并引起其他问题. 我如何成功退出我的分离性并返回称为它的爪哇式性? 解决方案 我遇到了相同的问题.基本上,当在主循环中调用AnativeActivity_finish(..)时,它对我有用,因为它在调用AnativeActivity_finish(.. ..)静态void android_app_destroy(结构android_app android_appry(struct android_app)(struct andr
10 2024-02-12
编程技术问答社区