from - No se puede llamar a la función miembro de C++ desde Java utilizando JNI
jni java ejemplos (1)
Seguí las instrucciones dadas a continuación en el enlace llamado Función de llamada c de Java y después de lo cual pude hacer una llamada a la función de C ++. Pero ahora quiero llamar a la función miembro de la clase C ++ desde Java. Para dar una imagen clara de esto, estoy citando el escenario a continuación.
JAVA. Hay una clase llamada HelloWorld.java y tiene una función nativa llamada print()
Ahora, usando el JNI de Java, he creado el archivo de encabezado equivalente para HelloWorld. Después de lo cual escribí la implementación de este archivo de encabezado en HelloWorld.cpp
Ahora desde "HelloWorld.cpp" quiero llamar a la función miembro de "rectangle.cpp" para la cual he creado el objeto de "rectángulo" y llamé a su función correspondiente. Pero al compilar el código me da un error llamado "símbolo externo no resuelto". Por el contrario, cuando escribo toda la implementación en el correspondiente archivo de encabezado "rectangle.cpp" que está en rectangle.h, el código se compila bien y me dio el resultado deseado. Mi pregunta, ¿hay alguna manera, después de lo cual puedo llamar a la función miembro de la clase .cpp no su correspondiente función de archivo de encabezado.
Debajo está el fragmento de código ::
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;
}
Problema asociado con un código escrito anteriormente: Cuando escribí toda la implementación de "rectángulo" en su archivo de encabezado "rectangle.h", me dio el resultado deseado. El problema es que el objeto "rectangular" creado en el archivo "HelloWorld.cpp" no hace referencia a "rectangle.cpp". Es por eso que cuando lo compilé y lo ejecuté, me dio la excepción de "símbolo externo no resuelto", lo que significa que el compilador o el depurador no pueden encontrar la implementación para la función definida en el archivo "rectangel.h". ¿Hay alguna forma de resolver este problema? Por favor ayuda.
En caso de que quiera usar múltiples fuentes, asegúrese de:
- poner todo dentro de una sola biblioteca, o
- asegúrese de crear múltiples bibliotecas y asegúrese de vincularlas adecuadamente.
Puede encontrar muestras muy simples aquí:
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo021 https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo023