Java 如何在android中使用.so库

Java 如何在android中使用.so库,java,android,java-native-interface,Java,Android,Java Native Interface,我正试图在我的Android应用程序中使用python解释器来运行SymPy。我已经使用本指南为arm编译了Python 这给了我一个libpython2.7.so文件,我把它放在jniLibs/armeabi/中。 在我的应用程序中,我按如下方式加载它: public class PythonTest { static { System.loadLibrary("python2.7"); } public static native void Py_I

我正试图在我的Android应用程序中使用python解释器来运行SymPy。我已经使用本指南为arm编译了Python

这给了我一个libpython2.7.so文件,我把它放在jniLibs/armeabi/中。 在我的应用程序中,我按如下方式加载它:

public class PythonTest {
    static {
        System.loadLibrary("python2.7");
    }

    public static native void Py_Initialize();
    public static native void Py_Finalize();
    public static native int PyRun_SimpleString(String s);
}
我正在尝试使用include目录中标题中的方法,该目录也可以在此处找到:

在我的设备上运行应用程序时,出现以下错误:

No implementation found for void com.example.dorian.testapplication.PythonTest.Py_Initialize() (tried Java_com_example_dorian_testapplication_PythonTest_Py_1Initialize and Java_com_example_dorian_testapplication_PythonTest_Py_1Initialize__)

所以对我来说,这看起来像是加载了库,但它似乎在寻找JNIEXPORT函数。但是我不应该不使用特定的C++文件就能使用这个库吗?如果没有,我将如何实现这一点。是否有工具可以生成包装文件或类似的东西?

您需要一个JNI包装库,它将充当Java代码和libpython2.7.so之间的桥梁。对于战略者来说,根据JNI约定包装这三个功能就足够了,例如

JNIEXPORT jint JNICALL com_example_dorian_testapplication_PythonTest_PyRun_1SimpleString
  (JNIEnv *env, jclass jc, jstring js)
{
    char* cs = env->GetStringUTFChars(js, 0);
    std::string s = new std::string(cs);
    env->ReleaseStringUTFChars(env, js, cs);
    return PyRun_SimpleString(s.c_str());
}
如果有不清楚的地方,请阅读位于的教程

请注意,您可以为PythonTest类使用任何包名,而不一定与您的Android应用程序包名相关,例如

package com.python27;
class Python {
static {
    System.loadLibrary("python2.7");
}

public static native void Initialize();
public static native void Finalize();
public static native int Run(String s);
}
将期待JNI包装器

JNIEXPORT void JNICALL com_python27_Python_Initialize(JNIEnv *env, jclass jc);
JNIEXPORT void JNICALL com_python27_Python_Finalize(JNIEnv *env, jclass jc);
JNIEXPORT jint JNICALL com_python27_Python_Run(JNIEnv *env, jclass jc, jstring js);
应该有帮助。