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

如何在JNI中从C ++调用Java方法

段恩
2023-03-14
问题内容

因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c
消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c
打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c
,然后可以在需要时使用它。当然,Java不支持方法指针。我的java方法如下所示:

private void log(String s){
   Log.i(Tag, s);     // Android log
}

我只是不知道如何允许c ++访问此方法。


问题答案:

C ++来调用coutprintf 不会出现 在logcat的输出。有两种解决方案。

  1. 使用NDK提供的Logging宏,该宏允许您将消息记录到LogCat。这对于您正在编写的新代码和包装器代码很有用,但是当您的库中充满了现有的调试语句时,效果就不好了。我定义宏如下:
    #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info)
    

然后在源代码中,我可以调用 LOG_INFO("Library is called!");

  1. 捕获程序的标准输出/标准错误,并将其合并到LogCat中。在“ Android调试桥”页面上:

查看stdout和stderr

默认情况下,Android系统将stdout和stderr(System.out和System.err)输出发送到/ dev /
null。在运行Dalvik
VM的进程中,您可以让系统将输出的副本写入日志文件。在这种情况下,系统将使用优先级为I的日志标签stdout和stderr将消息写入日志。

要以这种方式路由输出,请停止正在运行的仿真器/设备实例,然后使用shell命令setprop启用输出重定向。这是您的操作方式:

>       $ adb shell stop
  $ adb shell setprop log.redirect-stdio true
  $ adb shell start

在您终止仿真器/设备实例之前,系统将保留此设置。要将设置用作仿真器/设备实例上的默认设置,可以在设备上的/data/local.prop中添加一个条目。



 类似资料:
  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在

  • TL;博士我在通过线程将FFMPEG原始数据从C代码传递到JAVA代码(用于显示)时遇到问题。 有一个服务器可以向其客户端发送编码帧。这些编码的帧是用一些FFMPEG魔法编码的。在客户端接收时,前面提到的帧被解码为原始RGB数据(作为无符号字符*)。现在的问题是,帧在某种“侦听器”中被接收。只要一个线程在后台运行,轮询服务器,并在新帧可用时运行特定的功能。 当前以视频格式显示帧的解决方案是将每个帧

  • 问题内容: 我尝试在Android NDK上工作,我的第一个测试不是很确定,我需要帮助,因为我看不到错误在哪里。 以下代码可以毫无问题地进行编译,但是当在模拟器上运行时,该程序将返回SIGSEGV信号,并且在logcat中不会显式写入任何错误。但是,将显示一条警告,指出未找到Java类。经过一天的研究,这个问题看起来一切正确。 这是我的Java代码:JNITestActivity.java 这是我

  • 问题内容: 我试图从C ++获得一个简单的Java方法调用,而Java调用本机方法。这是Java代码: 我试图在从Java到本机的方法调用过程中从本机代码调用方法。 干净的编译应用停止并显示下一条消息后: 显然,这意味着方法名称错误,但对我来说似乎不错。 问题答案: 如果是对象方法,则需要将该对象传递给: 你正在做什么相当于。 由于你的方法无效,因此应调用: 如果要返回结果,则需要更改JNI签名(

  • 我的C代码无法找到Java中的公共静态函数调用。它成功地找到了类,没有错误。 我试图将结果返回给回调方法。“5”稍后将被更复杂的内容取代。 我在StackOverflow上似乎也有类似的问题,但是到目前为止没有任何变化似乎有所帮助。也许我有逻辑错误? 我的JNI(更新#2): 此代码包含在此函数中调用的方法中: 我的Java(更新#1): 签名检查: javap-s-pcecutils 公共静态响

  • 问题内容: 我需要从我的C ++程序中运行以下行: java -jar test.jar text1 text2 Java应用程序将给出一个float值并将其提供给c ++程序。 我怎样才能做到这一点?我从未从ms visual studio C ++文件中调用过Java东西。 问题答案: 当我直接在命令提示符下运行java命令时,它可以工作。但是当我从c ++文件运行命令时,错误显示“系统无法执