Как использовать библиотечные функции libusb.so в кодировке C или JAVA после успешной загрузки библиотеки?
Я пытаюсь использовать libusb.so Как я могу использовать библиотеку libusb в моем проекте Android.
Я скомпилировал библиотеку libusb для моего проекта Android с использованием libusb source. Теперь я хочу использовать функции недавно сгенерированной библиотеки libusb.so в своем коде. Я использовал следующий код... просто чтобы проверить, загружаются или нет функции. Что я должен сделать, чтобы вывести информацию об устройстве в моем приложении, используя библиотеку libusb.
код в каталоге jni..
libTest.c
#include <string.h>
#include <jni.h>
#include <stdio.h>
#include <sys/types.h>
JNIEXPORT jstring JNICALL Java_com_example_loadlibrary_MainActivity_libTask(JNIEnv* env, jobject obj)
{
if( libusb_init(NULL) )
return (*env)->NewStringUTF(env, "Library Loaded Successfuly!");
else
return (*env)->NewStringUTF(env, "Can not load library........");
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(CLEAR_VARS)
LOCAL_MODULE := libusb-1.0
LOCAL_SRC_FILES := libusb-1.0.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libTest
LOCAL_SRC_FILES := libTest.c
include $(BUILD_SHARED_LIBRARY)
libusb-1.0.so
и src содержит этот файл Java:
MainActivity.java
package com.example.loadlibrary;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText(libTask());
setContentView(tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private native String libTask();
static{
System.loadLibrary("usb-1.0");
System.loadLibrary("libTest");
}
}
но он показывает ошибку в компиляции ndk:
** ошибка: неопределенная ссылка на 'libusb_init' collect2: ld вернул 1 состояние выхода make: [obj / local / armeabi / libTest.so] Ошибка 1 *
это показывает, что функция не определена в моем коде. Так как я смогу заставить все функции работать....
и, если я сделаю
заменить: if( libusb_init(NULL)) на: if(1)
все файлы генерируются, но показывает эту ошибку:
рецепт для цели Loadlibrary.exe' failed makefile /Loadlibrary/Debug line 31 C/C++ Problem
undefined reference to
_WinMain@16' Loadlibrary строка 39, внешнее расположение: \usr\src\debug\cygwin-1.7.17-1\winsup\cygwin\lib\libcmain.c C/C++ Проблема make: * [Loadlibrary6.exe] Ошибка 1 Loadlibrary Проблема C / C++
2 ответа
Сначала загрузите ваши библиотеки, а затем используйте функцию внутри них
static{
System.loadLibrary("usb-1.0");
System.loadLibrary("libTest");
}
public final static native String libTask(String st); //libTask is returning a string also...
.so файлы находятся в папке "jni", поэтому сначала проверьте, что после сборки они также создаются в папке "libs/armeabi"??
То, что я использовал для сборки с поддержкой NDK и libusb, таково: Добавьте в свой Android.mk
LOCAL_LDLIBS: = - L / path / to / your / compiled / libusb.so -lusbПопробуйте. Надеюсь это поможет.