簡體   English   中英

如何在Android中使用.so庫

[英]How to use .so library in android

我正在嘗試在Android應用中使用python解釋器來運行SymPy。 我已經使用該指南編譯了Python。 http://mdqinc.com/blog/2011/09/cross-compiling-python-for-android/

這給了我一個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);
}

我正在嘗試使用包含目錄中包含的標頭中的方法,也可以在以下位置找到該方法: https : //docs.python.org/2/c-api/

在設備上運行應用程序時,出現以下錯誤:

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());
}

如果不清楚,請閱讀http://joaoventura.net/blog/2014/python-android-2上的教程。

請注意,您可以為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM