2015-10-03 48 views
0

我想在我的Android應用程序中使用python解釋器來運行SymPy。我已經使用本指南編譯了Python for arm。 http://mdqinc.com/blog/2011/09/cross-compiling-python-for-android/如何在android中使用.so庫

這給我一個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目錄的頭它也可以在這裏找到方法: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++文件,我不應該使用這個庫嗎?如果不是,我將如何實現這一點。可能有一個工具來生成包裝文件或類似的東西?

+0

http://stackoverflow.com/questions/5659068/jni-tutorial-for-android應該有所幫助。 – headuck

回答

0

您需要一個JNI包裝庫lib,它將充當您的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); 
+1

謝謝,它現在有效。 (回覆晚了非常抱歉) – D0r1an

相關問題