Android NDK:从 C++ 调用 Java 函数

2024-02-16

我对 JNI 非常陌生,在将 C++ iOS 代码移植到 JNI 之前,我试图弄清楚某些事情是如何工作的。我成功地让 NDK 示例之一在 Android studio 中运行,我可以看到 Java 如何调用 C++ 函数。

我一直在四处寻找并获取大量代码,但我无法让它在我的具体实现中工作。

只是为了测试事情是如何工作的,我在 java 中设置了一个简单的文本日志函数,我试图从我的本机代码中调用它,但我遇到了问题。

这是我的 Java 函数:

public static void log(String s){
        Log.d("Native", s);
}

And C++:

void Log(std::string s){

    JNIEnv *env;
    g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);

    jstring jstr1 = env->NewStringUTF(s.c_str());

    jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
    jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");

    jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}

从我在不同示例中看到的情况来看,这应该可行,但会引发错误:

29835-29849/com.android.gl2jni A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 29849 (Thread-17371)

我错过了什么吗?

EDIT:

我已将其更改为 GetStaticMethodID。但在记录函数的进度后,我发现失败的行是:

g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);

我认为是因为 g_JavaVM 设置为static JavaVM* g_JavaVM = NULL;然后就再也没有碰过。我猜我需要设置这个变量,但是如何设置呢?


我的部分问题是我没有初始化 JavaVM。另一部分是我正在使用 C++,但我正在尝试使用 C 函数。

工作代码是:

Java:

public static void log(String s){
        Log.d("Native", s);
}

C++:

void Log(std::string s){

    JNIEnv *env;
    g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);

    jstring jstr1 = env->NewStringUTF(s.c_str());

    jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
    jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");

    jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}

//In some initialization function with Environment variable

env->GetJavaVM(&g_JavaVM);

希望这可以帮助其他遇到同样问题的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK:从 C++ 调用 Java 函数 的相关文章

随机推荐

  • 无法在反应挂钩中单击按钮时绑定单选按钮和复选框数据

    我有一个表单 当我提交数据时 它将发送到服务器并在表格中显示数据 在表中我有编辑按钮 当单击编辑按钮时 数据应该绑定到表单 在这里 我无法绑定输入字段 但不能绑定单选按钮和复选框 const Form gt const data setda
  • 如何在烧瓶应用程序中初始化时加载文件

    我有一个大文件 我们称之为 machine learning model hdf5 每次点击发布请求端点时 我都会将其加载到我的应用程序中 伪代码如下所示 def post self model load model machine lea
  • Cloud Explorer - 无法访问开发 Blob 容器

    我正在使用 VS2015 在本地使用 Azure 存储进行开发 我创建并访问了我的开发存储 blob 容器 效果很好 我上传了三张图像 并有代码来计算图像的大小 由于某些未知原因 我无法再在 Cloud Explorer 中展开 Blob
  • UWP:是否可以创建自己的网络文件(类似于 Onedrive)?

    我正在查看文档确定 Microsoft OneDrive 文件的可用性 https learn microsoft com en us windows uwp files quickstart determining availabilit
  • React Hooks 错误:只能在函数组件体内调用 Hooks

    我在使用时收到此错误useState钩 我有它的基本形式 看看反应文档 https reactjs org docs hooks reference html usestate供参考 但我仍然收到此错误 我已经准备好迎接掌脸时刻了 expo
  • 防止 Access 在切换到设计模式时弄乱它无法理解的查询

    在做了很长时间的其他事情后回到 Access 有一件事确实让我烦恼 那就是如果您无意中在设计模式下打开一个查询 设计器无法表示 sql 即使它是有效的 设计师将为您 更正 您的查询 并且无法撤消 有没有解决这个问题的方法 或者我至少可以让它
  • 如何区分SQLAlchemy IntegrityError的原因?

    SQLAlchemy 似乎只是抛出一个一般IntegrityError当事务存在数据完整性问题时 当然 确切的查询和错误消息包含在异常中 这足以供人调试程序 然而 在为异常编写错误处理代码时 据我所知 似乎没有一个好的方法来检查哪个表上的哪
  • 为什么 ComboBox 是下拉结果整个应用程序性能非常慢?

    我有一个wpf应用程序 有一个奇怪的事情 只要我按下鼠标 ComboBox下拉箭头就会变得所有UI响应都很慢 无论ComboBox是否有项目 烦人的情况只出现在某些计算机上 期待答复 我查看了您可以在互联网上找到的提示 我发现没有任何问题
  • 如何修复“未找到自定义操作文件的安装项目”异常?

    我正在尝试为 Windows 服务创建一个安装项目 我已按照以下指示进行操作http support microsoft com kb 816169 http support microsoft com kb 816169轻松创建安装项目
  • 向ggplot添加水平线

    我想使用 ggplot2 在一个图中绘制多条不同颜色的线 然后添加一条单独的水平线 我的代码如下 在我运行最后一行之前它运行良好p geom hline yintercept 400 所有线条都变成黑色 右侧的图例消失 有谁知道如何解决这个
  • 通过使用显式构造函数将相同的参数传递给每个元素来构造元组

    以下内容在 Visual C 2015 Update 2 上运行良好 请注意A是不可复制的并且A A is explicit include
  • 有没有办法“持久”地将 git 存储库与 SVN 同步?

    从我在网上找到的信息来看 似乎使用git svn不是 坚持 意思是 如果我git svn clone一个存储库 然后推送到 master 并在单独的文件夹中重新拉取一个新副本 该新副本根本不知道 svn 并且无法在不重新应用的情况下用于与
  • 在 Ansible 中创建已安装软件包的报告

    我正在尝试制作一份包含几台机器上已安装的软件包及其版本的报告 该报告必须在执行 playbook 的计算机上创建 这是我当前的剧本 name main hosts all gather facts no become true tasks
  • Excel 中按轮廓级别(组)着色

    我想根据 Excel 中的大纲级别更改单元格的颜色 大纲级别是指列分组的级别 我正在尝试使用 ActiveCell OutlineLevel 属性在 ColorByValue 过滤器中使用 这可能吗 或者 有没有办法通过 VBA 或函数来做
  • Flex:包裹的物品与其他物品的宽度相同

    我使用 Flex 创建一个多列列表 该列表根据容器的宽度调整列数 我发现的问题是 如果我想通过将 flex grow 设置为 1 来使用父级的完整宽度 则最后一个换行行中的项目会未对齐 因为它们试图填充父级 我发现了两种对我不起作用的解决方
  • 如果屏幕尺寸小于指定值,则将水平块转换为垂直块

    在下面的代码中 我希望水平三列块放置并堆叠在彼此之上 以防容器的大小小于 X 像素 对于较小或移动设备 我应该如何以及在表的哪个元素上应用此属性 请注意 代码是一个内容块 因此我不想将 CSS 应用于整个电子邮件模板或电子邮件除非这是解决这
  • HKLM\Software 下的 OpenSubKey 返回 null

    这是我的代码 Microsoft Win32 RegistryKey key Microsoft Win32 Registry LocalMachine OpenSubKey SOFTWARE ADM 该注册表项存在于计算机上 键始终为空
  • ASP.NET Core上的静态文件

    我正在尝试启用静态文件ASP NET Core 2 0Web应用程序 我在一个名为 updater 的文件夹中有一堆文件 该文件夹位于wwwroot文件夹 为了允许访问它们 我添加了 app UseStaticFiles new Stati
  • 使用 numpy 将二进制掩码应用于 RGB 图像时出现问题

    我正在尝试使用 numpy 将二进制掩码应用于 RGB 图像 我找到了这个https stackoverflow com a 26843467 4628384 https stackoverflow com a 26843467 46283
  • Android NDK:从 C++ 调用 Java 函数

    我对 JNI 非常陌生 在将 C iOS 代码移植到 JNI 之前 我试图弄清楚某些事情是如何工作的 我成功地让 NDK 示例之一在 Android studio 中运行 我可以看到 Java 如何调用 C 函数 我一直在四处寻找并获取大量