当前位置: 首页 > 面试题库 >

Android NDK,保留实时C ++对象

葛烨
2023-03-14
问题内容

我有以下问题。我想编写一个Android应用程序,它使用我的旧C 类。我必须在整个应用程序生命周期中保持C 对象的生命。

我用C#编写了一个类似的应用程序,并通过将指向C
类的指针传递给C#并使用IntPtr将其存储在那里解决了该问题。然后,当我想在该对象上调用方法时,我只需将该指针再次传递给C

,转换为类指针,然后在其上调用方法。

如何在Java和Android NDK中获得类似的结果?Java是否支持存储指针?


问题答案:

是的,您可以执行与C#中完全相同的操作。

要创建新的C ++对象:

jlong
Java_package_name_new(JNIEnv *, jobject) {
  return (long)(new CPP_Object()); 
}

您可以将此方法的返回值存储在Java ptr变量中,并将其传递给需要它的所有NDK方法

void
Java_package_name_doSomething(JNIEnv *, jobject, jlong ptr) {
  CPP_Object *obj = (CPP_Object *)ptr;
  // do whatever you want with the object
}

最后用类似以下的命令删除它:

void
Java_package_name_delete(JNIEnv *, jobject, jlong ptr) {
  delete (CPP_Object *)(ptr);
}

除了传递ptr给需要它的所有方法外,您还可以使用SetLongFieldGetLongField方法从NDK部分直接获取它并进行设置:这允许ptr仅从代码的NDK部分管理Java
变量,我认为这更安全,并且更易于管理。



 类似资料:
  • 我试图建立FFMPEG库为我的Android应用程序使用NDK。我已经从它的网站上下载了源代码,我想我构建了它(这是我第一次尝试使用NDK和ffmpeg)。我已经创建了一个文件,我正在使用它从Mac OS X上的命令行执行它。 首先,我知道我需要Android。mk文件,所以我可以在我的应用程序中使用构建的库,但我不知道如何做到这一点,原因我在上面告诉过你。在我运行android文件夹中有一些文件

  • 我想把我的C#(托管)解密方法转换成Android NDK, C/C(NO JAVA) 我看到有加密。在JAVA方面,但我想远离任何JNI,我还看到有mcrypt和crypt,但找不到适用于android的编译库。 这里有一个C#的例子,我想把它翻译成C/C 更新到目前为止,我发现最好的方法是使用openSSL AES,我已经下载了一个预编译的Android库,我只是在努力让它与一些已经发布的示例

  • 我想在搜索后没有找到结果的时候展示吐司,我做了一个简单的吐司,但是吐司留了很长时间,我想在短时间后它就消失了 这是代码

  • 问题内容: 我正在尝试使用setRetainInstance(),但似乎对我不起作用!=(。我将问题简化为最简单的版本: 我有一个带有TextView和Button的片段。 当按下按钮时,TextView的初始文本为“我在等待”,文本变为“ Hello!”。 那是我的代码: 片段: 活动: 活动的布局: 片段的布局: 但是当我播放它时,按下按钮并更改设备的方向,文字将被重置。 我想念什么?我该如何

  • 问题内容: 好的,我有一个关键字我故意远离标签和标题。那是“ Android”,但这是因为即使该项目是在Android中,我也不认为我的问题与它有关,并且我也不想吓到没有Android经验的人。 因此,swig常见的问题。我在C ++类中有一个虚拟方法,通过将功能添加到类中,使其在Java中变得可重载,并且可以使用。问题在于该方法接收一个多态参数,该参数也在Java端扩展,并且在Java中的虚拟方

  • 我似乎正在与光束中的这种模式作斗争。这是一个流式管道。 在高水平上: 消息传入兔子 消息内容包括一个ID和N个S3文件路径 我希望在列出的所有S3文件中产生一些聚合,但结果应该由原始消息键控 向rabbit写一条带有聚合结果的消息,每个传入消息一条 不可避免的是,我最终得到了一些,并希望在上应用一系列,但不要忘记它们最初是由键控的。 我似乎找不到一个通用的“映射KV pcollection的值但保