Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用JNI导入使用第三方功能(Python.h)的C中的共享库_Java_Python_Exception_Java Native Interface_Shared Libraries - Fatal编程技术网

Java使用JNI导入使用第三方功能(Python.h)的C中的共享库

Java使用JNI导入使用第三方功能(Python.h)的C中的共享库,java,python,exception,java-native-interface,shared-libraries,Java,Python,Exception,Java Native Interface,Shared Libraries,我对lib.com的JNI集成有一个问题,因此它是从lib.c编译的,如下所示: #include <jni.h> #include "messageService.h" #include <Python.h> PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; JNIEXPORT jboolean JNICALL Java_Test_test (JNIEnv * pEnv, jc

我对lib.com的JNI集成有一个问题,因此它是从lib.c编译的,如下所示:

#include <jni.h>
#include "messageService.h"
#include <Python.h>

PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;

JNIEXPORT jboolean JNICALL Java_Test_test
 (JNIEnv * pEnv, jclass clazz)
{
    Py_Initialize();
    pName = PyString_FromString("mylib");
    pModule = PyImport_Import(pName);
    Py_DECREF(pName);
    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule,"test");
        if (pFunc && PyCallable_Check(pFunc)) {
            PyObject_CallObject(pFunc, NULL);
            Py_DECREF(pFunc);
            if (PyErr_Occurred()){
                PyErr_Print();
                jclass exc = (*pEnv)->FindClass( pEnv, "java/lang/Exception" );
                if ( exc != NULL )
                    (*pEnv)->ThrowNew( pEnv, exc, "in C code; Error while executing \"test\"" );
                return (jboolean) 0;
            }
            return (jboolean) 1;
        }
        else {
            if (PyErr_Occurred())
                PyErr_Print();
            jclass exc = (*pEnv)->FindClass( pEnv, "java/lang/Exception" );
            if ( exc != NULL )
                (*pEnv)->ThrowNew( pEnv, exc, "in C code; Cannot find function \"test\"" );
            return (jboolean) 0;
        }
        Py_XDECREF(pFunc);
        return (jboolean) 0;
    }
    else {
        PyErr_Print();
        jclass exc = (*pEnv)->FindClass( pEnv, "java/lang/Exception" );
        if ( exc != NULL )
            (*pEnv)->ThrowNew( pEnv, exc, "in C code; Failed to load \"mylib\"" );
    }
    return (jboolean) 0;
}
运行程序时的结果: 主线程java.lang.UnsatifiedLinkError:/pathtomyso/lib.so:/pathtomyso/lib.so中出现异常:未定义符号:Py_初始化

您知道为什么Py_从Python.h初始化的功能是未知的吗

编辑:1 我在谷歌上搜索,似乎得到了一个错误的答案。 现在我使用:

cc lib.c -o lib.so  -I/usr/lib/jvm/java-7-openjdk-i386/include/ -I /usr/include/python2.7 -lpython2.7 -shared -lc
但我仍然有一些错误。我的python模块使用用于blueZ蓝牙堆栈的python包装器。但它无法导入集成在此模块中的共享库:

File "/usr/local/lib/python2.7/dist-packages/mylib.egg/mylib/test.py", line 10, in <module>
    import bluetooth
  File "/usr/local/lib/python2.7/dist-packages/bluetooth/__init__.py", line 34, in <module>
    from bluez import *
  File "/usr/local/lib/python2.7/dist-packages/bluetooth/bluez.py", line 6, in <module>
    import _bluetooth as _bt
/usr/local/lib/python2.7/dist-packages/bluetooth/_bluetooth.so: undefined symbol: PyExc_ValueError

我遇到了类似的问题并解决了它。我的问题和解决方案:
Java通过JNA调用liba.so,liba.so调用libb.so,libb.so调用python脚本。在liba.so中,您应该在dlopen中使用RTLD_NOW | RTLD_GLOBAL。仅此而已。

您可能还需要加载通过Python.h引用的Python库。请查看Edit1以获取我的答案。评论时间太长了。但我不确定我是如何编译我的共享库的。看看我对这种静态和共享库的东西是新的。。。问题的核心是我不能在我想要创建的共享库中使用共享库,因为依赖关系没有正确解决吗?
File "/usr/local/lib/python2.7/dist-packages/mylib.egg/mylib/test.py", line 10, in <module>
    import bluetooth
  File "/usr/local/lib/python2.7/dist-packages/bluetooth/__init__.py", line 34, in <module>
    from bluez import *
  File "/usr/local/lib/python2.7/dist-packages/bluetooth/bluez.py", line 6, in <module>
    import _bluetooth as _bt
/usr/local/lib/python2.7/dist-packages/bluetooth/_bluetooth.so: undefined symbol: PyExc_ValueError