无法使用JNI

时间:2015-07-20 15:26:50

标签: java c++ java-native-interface interop

我按照下面说明的链接给出了说明     Call c function from Java     然后我就可以调用C ++函数了。     但是现在我想从Java调用C ++类的成员函数。     为了清楚地描述它,我引用了下面的场景。

JAVA。     有一个名为HelloWorld.java的类     它有一个名为print()的原生函数     现在使用Java的JNI我创建了     HelloWorld的等效头文件。     之后我写了实现     HelloWorld.cpp

中的头文件

现在来自“HelloWorld.cpp”我想打电话给  “rectangle.cpp”的成员函数 我创建了“矩形”的对象和 称其相应的功能。  但是在编译代码时它会给我一个错误  被称为“未解决的外部符号”。在  相反,当我写下所有的实现  相应的头文件“rectangle.cpp”即  在rectangle.h中,代码编译得很好,它给出了  我想要的结果。                    我的问题,没有办法, 以下我可以调用.cpp的成员函数  class不是它对应的头文件函数。

以下是代码段::

HelloWorld.java

 class HelloWorld {

 private native void print();
 private native void multiply();


 public static void main(String[] args) {
     new HelloWorld().print();
     new HelloWorld().multiply();

 }

 static {
     System.loadLibrary("HelloWorld");
 }  }

HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */

JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

/*
 * Class:     HelloWorld
 * Method:    multiply
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_multiply
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

HelloWorld.cpp

 #include <jni.h>
 #include <stdio.h>
 #include "rectangle.h"
 #include "HelloWorld.h"



JNIEXPORT void JNICALL   Java_HelloWorld_print(JNIEnv *env, jobject
obj)  
{
//     printf("Hello World!dfdfdfdf\n");
//     return;  

Rectangle rectangle;
rectangle.set_values(3,4);
printf("Area of Rectangle %d", rectangle.get_values());

} 
JNIEXPORT void JNICALL Java_HelloWorld_multiply
  (JNIEnv *, jobject)
{
//printf("dila ");
}

rectangle.h

#ifndef GUARD_SNAKE_H
#define GUARD_SNAKE_H
class Rectangle{
  public:
    Rectangle(void);
 //   ~Rectangle(); 


    void  set_values(int x,int y);
    int get_values();   
  private:
  int width;
  int height;


};

#endif

rectangle.cpp

// classes example
#include "rectangle.h"
Rectangle::Rectangle(void)
{
}
void  Rectangle::set_values(int x, int y) 
{
  width = x;
  height = y;
}
int Rectangle::get_values()
{
return width*height;    
}

与上述代码相关的问题:当我在其头文件“rectangle.h”中编写了“矩形”的所有实现时,它给了我想要的结果。问题是在“HelloWorld.cpp”文件上创建的“矩形”对象不是指“rectangle.cpp”。这就是为什么当我编译并运行它时,它给了我“未解析的外部符号”异常,这意味着编译器或调试器无法找到“rectangel.h”文件中定义的函数的实现。有没有办法解决这个问题.. 请帮助。

1 个答案:

答案 0 :(得分:0)

如果您想使用多个来源,请务必:

  • 将所有内容放在单个库中,或
  • 确保创建多个库并确保正确链接它们。

您可以在这里找到非常简单的示例:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo021 https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo023