Как использовать библиотечные функции 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 
Попробуйте. Надеюсь это поможет.

Другие вопросы по тегам