java - C++ 应用程序可以使用 JNI 加载 .jar 文件吗?

标签 java c++ java-native-interface multilingual

感谢您查看问题。 我正在尝试使用 JNI 接口(interface)调用类文件中的 java 方法。反过来,被调用的类文件应该执行位于同一目录中的另一个 .jar 文件吗?我很难做到这一点,但我没有成功执行 .jar 文件。我的意思是我无法从 .jar 文件中可用的类文件中获取结果。

谁能解释一下,是否可以这样做,或者我应该寻找另一种选择?

代码是这样的:

class JNIInterface
{
private:
 JavaVMInitArgs vm_args;
 JavaVM *jvm;
 JNIEnv *env;
 long result;
 jmethodID mid;
 jfieldID fid;
 jobject jobj;
 jclass cls;
 int asize;
 char  JVMOptionString[20];
 char  className[20];
 char  methodName[20];
 JavaVMOption options[1];

public:
 JNIInterface(char* JVMOptionString)
 {
//  JavaVMOption options[1];
  options[0].optionString = JVMOptionString;
  vm_args.options = options;
  vm_args.nOptions = 1;

  vm_args.version = JNI_VERSION_1_6;
  vm_args.ignoreUnrecognized = JNI_FALSE;
 }
 void setClassName(char* className)
 {  
  result = JNI_CreateJavaVM( &jvm,(void **)&env, &vm_args);
  if(result == JNI_ERR ) 
  {
   printf("Error invoking the JVM\n");
   //return 0;
  }
  cls = env->FindClass("F2C");
  if( cls == NULL ) 
  {
   printf("can't find class F2C\n");
   //return 0;
  }

  env->ExceptionClear();
 }

 void setMethodName(char* methodName)
 {
  cout<<"----------  Function Name is "<<methodName<<endl;

  //----------  Integer Value with Parameter ----------------
  mid=env->GetStaticMethodID(cls, methodName, "([Ljava/lang/String;)V");
  if (mid != NULL)
  {
   env->CallStaticVoidMethod(cls,mid,"70");
  }
int main()
{
 JNIInterface JNIInterfaceObj("-Djava.class.path=C:\\MyPOC;C:\\MyPOC\\herong.jar");

    JNIInterfaceObj.setClassName("F2C");

 JNIInterfaceObj.setMethodName("main");
return 0;
}

.

//The java file which is calling jar files is - F2C.java

/**
 * F2C.java
 * Copyright (c) 2006 by Dr. Herong Yang, http://www.herongyang.com/
 */
import herong.TempratureConvertorBean;

public class F2C {

 public void test(String[] arg) {
  try {

   double f = 0.0;
   System.out.println("Inside test func:");
   TempratureConvertorBean b = new TempratureConvertorBean();

   if (arg.length>0) f = Double.parseDouble(arg[0]);
     b.setFahrenheit(f);
   double c = b.getCelsius();
   System.out.println("Fahrenheit = "+f);
   System.out.println("Celsius = "+c);
   System.out.println(b.getInfo());

  } 
}

public static void main(String[] arg) {
    F2C f2c = new F2C();
      f2c.test(arg);
  }
}  

这个F2C.java使用了herong.jar文件

如果你有任何想法,请提出建议。 谢谢, 副总裁

最佳答案

你的问题不是很清楚,但我会给出一个笼统的答案......

在 Java 中,只有两种方法可以让 Java 查找 .jar 文件(最后归结为一种方法),那就是在类路径中指定 .jar 文件,或者创建一个将查找该 jar 文件并将其添加到 Java 将使用的类加载器列表中的类加载器。

当然,所有的类路径都是一组类加载器,Java 在您的程序启动之前就实例化和使用了这些类加载器。

因此,如果 JNI 程序需要 Java 开始查找额外的 . jar文件。

关于java - C++ 应用程序可以使用 JNI 加载 .jar 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025397/

相关文章:

c++ - 使用 QtCreator(qmake) 编译 wtwithqt 示例

c++ - 为什么不为匿名对象调用析构函数?

android - 是什么导致我的 C++ JNI 崩溃?

java - 如何从 Eclipse 项目的导入 JAR 中排除包?

java - 在包装类中进行转换

c++ - 如何为 delete 编写一个 C 包装器,它可以快速释放任何给它的类型而不告诉它是什么类型

通过 JNI/C++ 调用时未找到 Java 方法

java - 如何在 JNI 中访问从 C++ 返回 java.lang.String 的 Java 方法的返回值?

javascript - webview的onDownloadStart参数没有设置?如何检索文件名?

java - 字符串池在 Java 中为同一个字符串创建两个字符串对象