我正在运行 elementary OS 64 位。 Eclipse ADT。
您好,我正在尝试通过 JNI 从 C++ 获取一个字符串到 java。
但是,根据我尝试运行应用程序的方式,我遇到了两个问题。
- error) 当我
在 eclipse 中运行
时出现以下错误
- 这是eclipse中的文件结构
- 这是 java 构建路径,包括 eclipse 中的 native 库
这是文件。
Controller.java
package sslarp.controller;
public class Controller {
private native String getMyMac(); // returns the current machines mac address
private native String getMyIp(); // returns the current machines ip address
static {
System.loadLibrary("getmacip");
}
private String myMac;
private String myIp;
public Controller() {
}
public void run() {
myMac = getMyMac();
myIp = getMyIp();
System.out.println("java: mac "+myMac+"\njava: ip "+myIp+"\n");
}
public static void main(String[] args) {
System.out.println("java: starting");
Controller controller = new Controller();
controller.run();
}
}
Controller.class 是通过 javac 命令生成的,位于 /home/karl/workspace/sslarp/bin/sslarp/controller/Controller.class
sslarp_controller_Controller.h通过javah
命令生成
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class sslarp_controller_Controller */
#ifndef _Included_sslarp_controller_Controller
#define _Included_sslarp_controller_Controller
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: sslarp_controller_Controller
* Method: getMyMac
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_sslarp_controller_Controller_getMyMac
(JNIEnv *, jobject);
/*
* Class: sslarp_controller_Controller
* Method: getMyIp
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_sslarp_controller_Controller_getMyIp
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
getmacip.cpp 这是我自己做的
#include <jni.h>
#include <stdio.h>
JNIEXPORT jstring JNICALL Java_sslarp_controller_Controller_getMyMac
(JNIEnv *jenv, jobject jobj)
{
printf("c: getMyMac() invoked!\n");
char str[] = "foo";
jstring jstr = jenv->NewStringUTF(str);
return jstr;
}
JNIEXPORT jstring JNICALL Java_sslarp_controller_Controller_getMyIp
(JNIEnv *jenv, jobject jobj)
{
printf("c: getMyMac() invoked!\n");
char str[] = "bar";
jstring jstr = jenv->NewStringUTF(str);
return jstr;
}
libgetmacip.so 通过命令 karl@karl-vm:~/workspace/sslarp/bin$ g++ -fPIC -o libgetmacip.so -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux getmacip.cpp -lc
我还使用以下命令 karl@karl-vm:~/workspace/sslarp/bin$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/karl/workspace/sslarp/lib/
添加库到java路径
最佳答案
我忘记在 getmacip.cpp
文件中包含代码 #include "sslarp_controller_Controller.h"
。
基本上我忘了将 header 添加到 .cpp 文件中。
关于java - jstring/c++ 的 Ljava/lang/String 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27110405/