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

您好,我正在尝试通过JNI将字符串从C++转换为Java。

但是,根据我如何尝试和运行应用程序,我遇到两个问题。

run in eclipse 时出现以下错误)


  • 这是 eclipse
  • 中的文件结构


  • 这是Java构建路径,包括Eclipse中的本机库


  • 这是文件。

    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 是通过驻留在/home/karl/workspace/sslarp/bin/sslarp/controller/Controller.class中的 javac生成的命令

    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路径

    最佳答案

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

    基本上我忘了将 header 添加到.cpp文件。

    10-08 01:19