jstring / c ++中的Ljava / lang / String错误

时间:2014-11-24 17:17:55

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

我正在运行基本的OS 64位。 Eclipse ADT。

你好我试图通过JNI从C ++到java获取一个字符串。

但是我遇到两个问题,具体取决于我如何尝试运行我的应用程序。

  • 错误)我run in eclipse
  • 时出现以下错误

enter image description here

enter image description here

  • 这是eclipse中的文件结构

enter image description here

  • 这是java构建路径,包括eclipse中的本机库

enter image description here

以下是文件。

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 命令在[{1}}

中生成的

sslarp_controller_Controller.h ,它是通过/home/karl/workspace/sslarp/bin/sslarp/controller/Controller.class命令生成的

javah

getmacip.cpp 我自己做了

/* 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

libgetmacip.so 通过命令#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; }

制作

我还使用以下命令karl@karl-vm:~/workspace/sslarp/bin$ g++ -fPIC -o libgetmacip.so -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux getmacip.cpp -lc将库添加到java路径

1 个答案:

答案 0 :(得分:0)

我忘记将代码#include "sslarp_controller_Controller.h"包含在getmacip.cpp文件中。

基本上我忘了将标题添加到.cpp文件中。