java - jstring/c++ 的 Ljava/lang/String 错误

标签 java c++ java-native-interface

我正在运行 elementary OS 64 位。 Eclipse ADT。

您好,我正在尝试通过 JNI 从 C++ 获取一个字符串到 java。

但是,根据我尝试运行应用程序的方式,我遇到了两个问题。

  • error) 当我 在 eclipse 中运行 时出现以下错误

enter image description here

enter image description here

  • 这是eclipse中的文件结构

enter image description here

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

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 命令生成的,位于 /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/

相关文章:

java - 执行hadoop代码时出现问题

c++ - 添加对共享 ptr 的引用会增加引用计数吗

c++ - 为什么引用的dynamic_cast会导致段错误?

android - JNI 静态库链接失败

android - 在 Xamarin 中正确绑定(bind) native 库

java - 如何映射 IceFaces <ice :selectInputDate> component on a java. util.Calendar 字段?

java - JOOQ selectQuery for Record5

java - 为什么我无法定义数组?

c++ - 线程事件会在程序退出后自动关闭吗?

java - 在 JNA 中创建全局引用