我正在为Android开发一个计算机视觉应用程序.这项工作涉及尽可能快地获取相机帧,所以我试图使用"android_native_app_glue"和"libnative_camera"直接在c ++中构建一个Android应用程序来获取相机帧.这似乎是不相容的.
我测试了2个选项.
sharedLibrary:libnative-activity.so C:/Development/android-opencv-wsp/samples/native-activity/obj/local/armeabi-v7a/objs/native-activity/main.o:在函数~Mat':
C:\Development\android-opencv-wsp\samples\native-activity/../../OpenCV-2.3.1/share/OpenCV/../../include/opencv2/core/mat.hpp:297: undefined reference to
cv :: fastFree中(void*)' 等等
LOCAL_STATIC_LIBRARIES:= android_native_app_glue
立即,当我添加此行时,我收到以下错误:SharedLibrary:libnative_sample.so C:/ Development/android-opencv -wsp/samples/tutorial-3-native/obj/local/armeabi-v7a/objs/native_sample/jni_part.o:在函数~Mat':
C:\Development\android-opencv-wsp\samples\tutorial-3-native/../../OpenCV-2.3.1/share/OpenCV/../../include/opencv2/core/mat.hpp:297: undefined reference to
cv :: fastFree(void*)'等等......
请问,是否有人使用openCV2.3.1和libnative_camera测试纯粹的原生活动以获取相机帧?
提前致谢.
我在我的引擎中使用纯C++在android中创建游戏引擎.没有单个java文件.基本上它是一个只应存储到外部存储器的游戏.当我通过adb手动将我的资产数据移动到我的外部SD卡时,游戏运行良好且稳定.
adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/
Run Code Online (Sandbox Code Playgroud)
这不是一个好的解决方案,因为它无法交付.因此,我在Assets文件夹中的资产数据在构建过程中被移动到apk文件中,具有以下结构:
Assets/Data/MoreFolders/Withsubfolders Assets/Data/EngineData.zip Assets/Data/ScriptData.zip
但我不知道文件系统上的那些文件在c ++代码中访问它们的位置.
所以我试图获取文件目录的路径.由于本机活动状态中的错误,我必须以正常代码检索信息.
// bug in 2.3 internalDataPath / externalDataPath = null using jni code instead
//FHZ_PRINTF("INTERNAL inter PATH = %s\n", state->activity->internalDataPath);
//FHZ_PRINTF("EXTERNAL inter PATH = %s\n", state->activity->externalDataPath);
Run Code Online (Sandbox Code Playgroud)
相当于android.os.Environment.getFilesDir()和android.os.Environment.getExternalStorageState()等的c ++代码
// getPath() - java
JNIEnv *jni_env = Core::HAZEOS::GetJNIEnv();
jclass cls_Env = jni_env->FindClass("android/app/NativeActivity");
jmethodID mid_getExtStorage = jni_env->GetMethodID(cls_Env, "getFilesDir","()Ljava/io/File;");
jobject obj_File = jni_env->CallObjectMethod( gstate->activity->clazz, mid_getExtStorage);
jclass cls_File = jni_env->FindClass("java/io/File");
jmethodID mid_getPath = jni_env->GetMethodID(cls_File, "getPath","()Ljava/lang/String;");
jstring obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
const char* path …
Run Code Online (Sandbox Code Playgroud) 在阅读相关文档之后,如果我只使用NDK编译的C++/C代码就可以创建用于获取用户输入的按钮或其他UI元素之类的内容.
当我想处理需要保持关注的"窗口"或活动时没有问题,但我不知道如何构建具有回调和用户输入元素的UI.
奇怪的是,有一个窗口框架,但没有任何UI元素回调的痕迹.
我可以使用NDK构建触摸按钮或虚拟游戏手柄吗?
我很欣赏我们的努力和事实,我们越来越接近我的观点,但显然我并没有解释自己足够好.
我在这里找到了这张图片
现在我的问题和这个问题的焦点是:
假设我可以把和得出这样的虚拟摇杆,我怎么能只检测运动并有一个回调像Joystick.onUp
或Joystick.onDown
Android和仅使用NDK?
如果NDK没有这种回调,我应该每次检测[x,y]位置,将其与我操纵杆的位置进行比较,存储前一个位置,比较前一个位置和下一个位置得到方向?
由于传感器以非常快的速度抛出事件,我认为仅考虑原始的X,Y耦合,我自己构建这个将最终导致一个非常低效的控制系统,因为它不会在适当的操作系统级别进行优化传感器呼叫.
根据NativeActivity示例,还不清楚如何处理多个触摸点,例如我如何同时处理2个触摸事件?
只需考虑上面的图像,并考虑只有1个触点的x,y坐标,以及如何以NDK支持的有效方式解决这个问题.
谢谢.
我的Native Activity应用程序有一些问题.它在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(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4830)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
...
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.该应用程序在armeabi,armeabi-v7a和x86文件夹中包含所有必需的库.它已经在许多具有不同架构的设备上进行了测试.
android:hasCode ="true"选项存在.
另外我注意到,这些有问题的设备大多数都有Rockchip CPU(RK3066,RK2928,RK2926).但不是所有的.最新的一款拥有华为K3V2 CPU和大量可用内存.另一个Native Activity应用程序(不是我的)也不适用于最新的设备.
我的android应用程序包含两个活动:".MainActivity"和"android.app.NativeActivity".后者完全用C++实现.在按钮上单击".MainActivity"我启动一个尝试传递一些参数的本机:
public void pressedButton(View view)
{
Intent intent = new Intent(this, android.app.NativeActivity.class);
intent.putExtra("MY_PARAM_1", 123);
intent.putExtra("MY_PARAM_2", 321);
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
如何从android.app.NativeActivity的入口点(即C函数void android_main(struct android_app* state)
)中获取MY_PARAM_1和MY_PARAM_2 ?
在我的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
Run Code Online (Sandbox Code Playgroud)
如果我编写一个小的命令行可执行文件链接libTemplate并手动调用ANativeActivity_onCreate,它链接并运行正常(如果我将LD_LIBRARY_PATH指向/data/data/com.mycompany.Template/lib)
如果我运行我的应用程序,我会收到这个非常有用的错
E/AndroidRuntime(13214): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.Template/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/data/com.mycompany.Template/lib/libTemplate.so
Run Code Online (Sandbox Code Playgroud)
它甚至没有输入ANativeActivity_onCreate,所以我唯一的猜测就是它与链接有关
我应该提一下,我正在使用CMake这个脚本:http://code.google.com/p/android-cmake/自己构建库(没有ndk-build).我设法用它编译本机活动样本,所以我知道它有效.
此外,我确保没有库包含其soname中的版本号
我的清单:
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.Template"
android:versionCode="1"
android:versionName="1.0">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="9" />
<!-- This .apk has no Java code itself, so set hasCode to false. …
Run Code Online (Sandbox Code Playgroud) 有没有办法将NativeActivity的内容设置为用Java创建的组件(例如FrameLayout,ImageView等)?我需要使用NativeActivity(用于在Xperia Play上获取触摸板输入),但我还需要能够查看在Java代码中创建的组件.
我已经尝试重写onCreate命令并在那里调用setContentView,但是虽然这不会引发任何错误,但它也没有做任何事情(显然是因为内容视图已经由本机代码设置).是否存在某种窗口ID或者我可以传递给本机代码以告诉它内容视图应该是什么,或者可以在XML中以某种方式设置它以将NativeActivity的内容视图设置为我可以修改的组件来自Java?
如果您需要更多信息,请与我们联系.
我有一个带有原生活动的Android项目.此本机活动使用名为"main"(libmain.so文件)的共享库进行启动.(代码为ndk/samples/native-activity)
这个程序工作正常.
"main"模块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)
Run Code Online (Sandbox Code Playgroud)
现在我想添加"main"库使用的另一个共享库(例如游戏引擎).我已经构建了一个"游戏"模块(libgame.so).
但是当我将"主要"与"游戏"联系起来时,就像这样:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../game
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_LDLIBS += $(LOCAL_PATH)/../../libs/$(TARGET_ARCH_ABI)/libgame.so
LOCAL_STATIC_LIBRARIES := android_native_app_glue game
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
Run Code Online (Sandbox Code Playgroud)
代码没有变化!
应用程序不再启动,我在Logcat中有这个错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myproject/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/data/com.mycompany.myproject/lib/libmain.so
Run Code Online (Sandbox Code Playgroud)
此崩溃是由于添加到共享库的链接...
为什么链接到共享库会导致应用程序无法加载(崩溃)? …
我在Android UI中寻求有关奇怪问题的帮助。我有一个用Java子类化的NativeActivity,如下所示:
public class MainActivity extends NativeActivity {
...
Run Code Online (Sandbox Code Playgroud)
在AndroidManifest.xml中:
<activity android:name="textactivity" android:screenOrientation="unspecified" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
Run Code Online (Sandbox Code Playgroud)
因此,它是通过JNI从C ++代码显示的EditText。C ++代码使用OpenGL ES进行绘图。
EditText的调用者:
...
Intent ebintent=new Intent(this,EditBoxActivity.class);
ebintent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivityForResult(ebintent,ebrescode);
Run Code Online (Sandbox Code Playgroud)
在EditText活动中,没有什么特别的,例如:
public class EditBoxActivity extends Activity {
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editbox);
LinearLayout linearlayout=(LinearLayout)findViewById(R.id.linearLayoutEditBox);
linearlayout.setPadding(xpos,ypos,0,0);
edttext=(EditText)findViewById(R.id.editText);
edttext.getLayoutParams().width=width;
edttext.getLayoutParams().height=height;
Run Code Online (Sandbox Code Playgroud)
并布局xml:
<LinearLayout
android:id="@+id/linearLayoutEditBox"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000">
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="0dp"
android:lines="1"
android:singleLine="true" />
Run Code Online (Sandbox Code Playgroud)
现在我的问题。它在所有设备上都可以正常运行,但不是,实际上有一些来自Galaxy S8 / S9用户的报告,这些报告已更新为Android 9.0 Pie,“我不能粘贴,我可以点击但不起作用”。我自己检查了一下,在8.0上它在我的Galaxy S9上运行正常,现在我更新到了9.0,并且:长按EditText,显示弹出窗口,上面写着“ Paste”,但是我点击了粘贴,但是点击不起作用,根本...我尝试了其他应用程序。没有像我这样的应用程序。他们中的大多数仅使用Java。他们工作,没有问题。对我来说,它看起来像是三星修改的Android框架中的错误。您如何看待,我有什么希望得到解决方法。我想在简单的文本框中粘贴文本,没什么特别的。
我尝试在其中创建带有EditBox的PopupWindow,但由于未知原因,不会显示粘贴弹出窗口。
我尝试将AppCompatActivity与AppCompatEditText一起使用,它看起来与其他应用程序相同,但是粘贴弹出窗口仍然无效。
user-interface android native-activity samsung-galaxy android-9.0-pie
我只能找到2010年及之前的解决方案.所以我想知道是否有更新的立场.
我想避免使用Java并纯粹使用C++来访问存储在APK中的文件(少于或多于1MB).使用AssetManager
意味着我不能像其他操作系统(包括iOS)上的每个其他文件一样访问文件.
如果没有,C++中是否有一个方法,我可以以某种方式将fopen/fread映射到AssetManager API?