我有一个旧的应用程序(C ++),我想通过JNI用java调用它。 所以我阅读了一些教程和基础知识(用Java调用C ++中的方法)非常有效。
但现在我的问题是我想在JNI使用的方法中实例化另一个C ++对象。这主要是不可能的,还是有办法做到这一点?
解释:
这是我的Java-Class helloworld.java,它调用本机方法'callnative()'
public class helloworld{
private native void callnative();
public static void main(String[] args){
new helloworld().callnative();
}
static {
System.loadLibrary("helloworld");
}
}
这是本机方法java_helloworld_callnative(..)
#include <jni.h>
#include <stdio.h>
#include "helloworld.h"
#include "hellouniverse.h"
JNIEXPORT void JNICALL Java_helloworld_callnative(JNIEnv *env,
jobject obj)
{
printf("HelloWorld\n");
hellouniverse *h = new hellouniverse();
h->printHelloUniverse();
return;
}
这是hellouniverse班级
#include "hellouniverse.h"
#include <stdio.h>
#include <string>
using namespace std;
hellouniverse::hellouniverse(){
}
void hellouniverse::printHelloUniverse(){
printf("HelloUniverse!!\n");
}
我用:
编译了helloworld.cppg ++ -fPIC -shared -I $ JAVA_PATH / include -I $ JAVA_PATH / include / linux / -o libhelloworld.so hellworld.cpp
和hellouniverse.cpp:
g ++ -c -o hellouniverse.o hellouniverse.cpp
当我运行java helloworld时,输出为:
的HelloWorld java:符号查找错误:$。/ libhelloworld.so:未定义符号:_ZN13hellouniverseC1Ev
我希望你能解决我的问题: - )
答案 0 :(得分:0)
您必须将hellouniverse
内容链接到库中。例如
g++ -fPIC -shared -I$JAVA_PATH/include -I$JAVA_PATH/include/linux/ -o libhelloworld.so hellworld.cpp hellouniverse.cpp
或者
g++ -fPIC -I $JAVA_PATH/include -I$JAVA_PATH/include/linux -c helloworld.cpp
g++ -fPIC -I $JAVA_PATH/include -I$JAVA_PATH/include/linux -c hellouniverse.cpp
g++ -fPIC -shared -o libhelloworld.so helloworld.o hellouniverse.o
考虑使用Makefile自动执行此操作。