2015-10-03 6 views
0

Я пытаюсь использовать интерпретатор python в своем приложении Android для запуска SymPy. Я уже скомпилировал Python для использования этого руководства. http://mdqinc.com/blog/2011/09/cross-compiling-python-for-android/Как использовать .so библиотеку в 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++? А если нет, как бы это сделать. Может ли быть инструмент для создания файлов-оберток или чего-то подобного?

+0

http://stackoverflow.com/questions/5659068/jni-tutorial-for-android должно помочь. – headuck

ответ

0

Вам нужна оболочка 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); 
+1

Спасибо, сейчас работает. (Извините за поздний ответ) – D0r1an

Смежные вопросы