从C语言调用Java函数

2024-06-15

我想从 c 代码调用 java 函数。 我使用了 JNI,如示例中所述http://www.ishaanguliani.com/content/calling-java-functions-c-linux-ubuntu-jni http://www.ishaanguliani.com/content/calling-java-functions-c-linux-ubuntu-jni

我使用相同的代码并遵循相同的步骤,但我无法找到类打印。

我调试了一下,但没有发现我做错了什么。

在这里分享我的代码

unions@universe:~/uni_tmp/jni/vvn$ cat MyC.c 

#include <stdio.h>
#include <jni.h>
#include "MyJava.h"
#include <string.h>

JNIEnv* create_vm(JavaVM ** jvm) {
  JNIEnv *env;
  JavaVMInitArgs vm_args;
  JavaVMOption options;
  options.optionString = "-Djava.class.path=./"; //Path to the java     source code
  vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates     version 1.6
  vm_args.nOptions = 1;
  vm_args.options = &options;
  vm_args.ignoreUnrecognized = 0;
  int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
  if(ret < 0)
    printf("\nUnable to Launch JVM\n"); 
  return env;
}

int main(void)
{
    JNIEnv *env;
    JavaVM *jvm;
    jmethodID mainMethod = NULL;
    jmethodID smfnMethod = NULL;
    jclass clsJava=NULL;
    jstring StringArg=NULL;

    env = create_vm(&jvm);
    if (env == NULL)
    {
       printf("\n Unable to create environment");
       return 1;
    }
    clsJava = (*env)->FindClass(env,"MyJava");
    if (clsJava != NULL)
    {
        printf("\n Able to find the requested class\n");  
    } else {
        printf("\n Unable to find the requested class\n");    
        return 0;   
    }
    mainMethod = (*env)->GetStaticMethodID(env, clsJava, "main", "    ([Ljava/lang/String;)V");

    smfnMethod = (*env)->GetStaticMethodID(env, clsJava,"sampleStaticFunc", "(Ljava/lang/String;)V");

    if (mainMethod != NULL)
    {
        printf("\n Calling the Java Main method");
        (*env)->CallStaticVoidMethod(env, clsJava, mainMethod, NULL);
    }
    StringArg = (*env)->NewStringUTF(env, "Argument from C");
    if (smfnMethod != NULL)
    {
        printf("\n Calling the Static Function method");
        (*env)->CallStaticVoidMethod(env, clsJava, smfnMethod,     StringArg);
    }
    printf("\n End C main \n");
    return 0;
}

Java代码

cat unions@universe:~/uni_tmp/jni/vvn$ cat MyJava.java 
public class MyJava 
{
  public MyJava()
  {
     System.out.println("\n Inside the constrcutor of Java Function \n "); 
  }
  private void sampleFunc(String str)
  {
     System.out.println("\n Inside sampleFunc value of string =  " + str); 
  }
  public static void sampleStaticFunc(String str)
  {
     System.out.println("\n Inside static sampleFunc value of string =      " + str); 
  }
  public static void main(String[] args)
  {
     MyJava obj = new MyJava();
     obj.sampleFunc("Ishaan is my name");
     System.out.println("\n Calling Java from C function \n"); 
  }
}

之后运行这些命令

unions@universe:~/uni_tmp/jni/vvn$ javac MyJava.java 
unions@universe:~/uni_tmp/jni/vvn$ javah -jni MyJava

当我编译并运行时,我得到了这个输出

export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server
unions@universe:~/uni_tmp/jni/vvn$ gcc -I /usr/lib/jvm/java-6-openjdk-amd64/include  -I /usr/lib/jvm/java-6-openjdk-amd64/include/linux -L /usr/bin/java -L /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server  MyC.c -ljvm ; ./a.out 

Unable to find the requested class

我哪里做错了?

我也将 options.optionString 更改为喜欢这个

options.optionString = "-Djava.class.path=/home/vpraveen/uni_tmp/jni/vvn";

即使输出没有变化。 有什么建议么?


我通过将我的类放入我自己的包中解决了这个问题。 当我们没有定义任何包时,它将作为默认包。 所以我创建了自己的包,如下所示

package com.aqu.vvn

我知道这是一种解决方法,但这样做对我有用。 当我弄清楚时,我会告诉你确切的方法。

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

从C语言调用Java函数 的相关文章

随机推荐

  • 有 CSS 的替代品吗?

    是否有替代 CSS 的样式表格式化语言 或者 CSS 是当前用于执行样式表格式化类型操作的单一语言 我查看了维基百科上 CSS 的描述 http en wikipedia org wiki Cascading Style Sheets ht
  • jasper 报告中的时区转换和日期格式?

    我正在处理 Jasper 报告 我想在其中显示选定的日期范围和时间 我使用以下表达式来格式化日期 但它显示 GMT 时区的时间 new SimpleDateFormat dd MMM yyyy format P START DATE new
  • 如何通过 jnlp 为 jetty 提供许多 Web 应用程序?

    我有一个网络应用程序 http sourceforge net projects sf mvn plugins files m2 repo net sf maven plugins example captaincasa jnlp 0 1
  • 在 direct3d11 对象上使用 std::shared_ptr 的自定义删除器

    当我使用 std shared ptr 并需要自定义删除器时 我通常会创建对象的成员函数以方便其销毁 如下所示 class Example public Destroy 然后当我使用共享 ptr 时 我只是这样做 std shared pt
  • 使用 WHILE 创建虚拟数据

    我尝试使用 a 在表中插入一些虚拟数据WHILE 但它运行得非常非常慢 我在想也许我写的代码不正确 你能看一下并确认一下吗 Insert dummy data DECLARE i int Content int SET i 5001 WHI
  • 如何获取 jquery datepicker 的当前活动实例

    我在单个页面上有多个日期选择器控件绑定到输入控件 当我单击链接到该输入的任何输入控件时 日期选择器控件将可见 现在我想要获取在另一个 JS 事件上显示日期选择器的当前实例的输入 是否可以 您可以尝试使用 datepicker getInst
  • 跨线程操作在BackgroundWorker中无效

    我想在数据网格视图中显示有关表单加载的一些数据 我想要显示的数据有大量行 当我使用后台工作处理器时 它向我显示以下错误 My code private void backgroundWorker1 DoWork object sender
  • 从 php 中的 PKCS7 签名中提取证书

    我需要从 pkcs7 签名文件中提取用户证书 我可以使用以下命令通过命令行来完成此操作 openssl pkcs7 in somesign pks7 inform PEM print certs 这将为我提供整个证书链 我可以处理生成的文件
  • 基于另一个数据集获取数据集的子集

    假设我有一个数据集 即 dat1 ID block plot SPID TotHeight 1 1 1 4 44 5 2 1 1 4 51 3 1 1 4 28 7 4 1 1 4 24 5 5 1 1 4 27 3 6 1 1 4 20
  • jquery-mobile 加载到 android WebView 中

    我无法将 jquerymobile 装饰的网页加载到 Android WebView 中 考虑 jquery 移动演示站点 http jquerymobile com demos 1 0a4 1 http jquerymobile com
  • 在 TinyMCE 中使用新的 iframe 嵌入代码嵌入 YouTube 视频

    我尝试使用旧的嵌入代码将 YouTube 视频添加到 TinyMCE 中 效果很好 一些用户可能没有意识到他们必须点击 YouTube 嵌入代码链接中的旧嵌入代码选项才能添加它 我想让用户变得更容易 并允许他们直接复制新的嵌入代码并将其粘贴
  • Laravel 5 Auth 注销不起作用

    当我使用内置身份验证并尝试在以下位置注销用户时 auth logout 它没有像希望的那样工作 它似乎让用户保持登录状态 但是当我清除浏览器缓存时 我可以看到实际上已经将用户注销了 我在页面上没有收到任何错误 在日志文件中也没有收到任何错误
  • 无法在 SSIS 2012 上使用敏感项目参数

    在 SSIS 2012 中 我尝试对 Oracle 的 OLEDB 连接使用敏感项目参数 它与 Sensitive 属性设置为完美配合FALSE 在项目参数设计器中 但我不希望密码像那样可见 一旦我将敏感属性设置为TRUE并尝试执行我的包
  • jQuery 提取 div 内的文本,但不在 p 标签中

    在下面的代码中 我想将一个变量放入文本中div但不是里面的东西p tag div class review content merchant review content I want to grab this text p class r
  • R 中具有稳健回归的异常值

    我正在使用lmrobR 中的函数使用robustbase用于稳健回归的库 我会把它用作 rob reg lt lmrob y 0 dat method MM control a1 当我想返回我使用的摘要时summary rob reg 稳健
  • 新的 Material Design 底部导航应使用哪个视图? [复制]

    这个问题在这里已经有答案了 我相信你们都听说过添加底部导航 https www google com design spec components bottom navigation html材料设计指南 我计划将其添加到我的应用程序中 但
  • 如何从 IIS 7.5 中的 PHP 页面诊断内部服务器错误 (HTTP 500)

    我正在尝试获取在我的本地开发计算机 带有 IIS 7 5 的 Windows 7 64 位 上运行的 aMember 会员管理系统的试用副本 我有 MySQL 5 5 10 和 PHP 5 3 6 后者是我使用 Windows 安装程序包安
  • 在 iPhone 上使用 Xcode Auto Layout 处理不同的图像尺寸

    通过纵向 iPhone 的自动布局 我不希望 iPhone 6 上的游戏角色的 UIImageView 尺寸与 iPhone 4S 中的完全相同 4S 的角色需要更小一些 否则看起来会太大 使用自动布局如何更改 iPhone 之间的图像尺寸
  • 转换BitmapImage后内存未释放

    我遇到以下 C 测试 代码的问题 public static void TestBitmap2ByteArray BitmapImage bitmap JpegBitmapEncoder encoder new JpegBitmapEnco
  • 从C语言调用Java函数

    我想从 c 代码调用 java 函数 我使用了 JNI 如示例中所述http www ishaanguliani com content calling java functions c linux ubuntu jni http www