[英]How Do You Use .so Shared Library in Java Android Studio Project
在过去的几天里,我一直在解决这个问题。 我正在尝试使用live555( http://www.live555.com/ ),一个C / C ++流媒体服务器,作为Java Android Studio项目中的库。 我已经能够使用ndk-build来创建一组.so文件,但是我找不到任何关于如何在我的Java应用程序中使用该库的文档。 这是我的设置:
到目前为止我所采取的步骤:
在上面的jni
文件夹中,创建Android.mk
和Application.mk
文件。 Application.mk
文件包含:
APP_OPTM := release APP_ABI := armeabi armeabi-v7a APP_PLATFORM := android-21 APP_STL := stlport_shared
Android.mk
文件包含:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := live555 LOCAL_SRC_FILES := \\ live\\BasicUsageEnvironment\\BasicHashTable.cpp \\ live\\BasicUsageEnvironment\\BasicTaskScheduler0.cpp \\ ...All of the rest of the .c and .cpp files LOCAL_C_INCLUDES := \\ $(LOCAL_PATH)\\live \\ $(LOCAL_PATH)\\live\\BasicUsageEnvironment\\include \\ $(LOCAL_PATH)\\live\\BasicUsageEnvironment \\ $(LOCAL_PATH)\\live\\UsageEnvironment\\include \\ $(LOCAL_PATH)\\live\\UsageEnvironment \\ $(LOCAL_PATH)\\live\\groupsock\\include \\ $(LOCAL_PATH)\\live\\groupsock \\ $(LOCAL_PATH)\\live\\liveMedia\\include \\ $(LOCAL_PATH)\\live\\liveMedia \\ LOCAL_CPPFLAGS += -fPIC -fexceptions -DXLOCALE_NOT_USED=1 -DNULL=0 -DNO_SSTREAM=1 -UIP_ADD_SOURCE_MEMBERSHIP include $(BUILD_SHARED_LIBRARY)
在我的$PROJECT_DIR\\gradle.properties
文件中,我包含了android.useDeprecatedNdk=true
在$PROJECT_DIR\\local.properties
,我有:
ndk.dir=C\\:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Android\\\\ndk sdk.dir=C\\:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Android\\\\sdk
在我的$PROJECT_DIR\\app\\build.gradle
文件中,我有:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.company.android.myapp" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "live555" } sourceSets.main { jni.srcDirs = [] jniLibs.srcDir "src\\\\main\\\\libs" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' }
然后我在$PROJECT_DIR\\app\\src\\main\\jni
文件夹中运行ndk-build
。
ndk-build
命令导致以下文件夹结构/文件输出:
$ PROJECT_DIR
| --app
| - | --src
| - | - | - 主
| - | - | - | --libs
| - | - | - | - | --armeabi
| - | - | - | - | - | --liblive555.so
| - | - | - | - | - | --libstlport_shared.so
| - | - | - | - | --armeabi-V7A
| - | - | - | - | - | --liblive555.so
| - | - | - | - | - | --libstlport_shared.so
| - | - | - | --obj
| - | - | - | - | --local
| - | - | - | - | - | --armeabi
| - | - | - | - | - | - | --objs
| - | - | - | - | - | - | --liblive555.so
| - | - | - | - | - | - | --libstlport_shared.so
| - | - | - | - | - | --armeabi-V7A
| - | - | - | - | - | - | --objs
| - | - | - | - | - | - | --liblive555.so
| - | - | - | - | - | - | --libstlport_shared.so
当我从Build |中构建项目时 创建项目菜单选项,我在Android视图中有一个项目结构,如下所示:
应用
| --manifests
| --java
| --jniLibs
| - | --armeabi
| - | - | --liblive555.so
| - | - | --libstlport_shared.so
| - | --armeabi-V7A
| - | - | --liblive555.so
| - | - | --libstlport_shared.so
| --res
我在我的项目中添加了一个Live555Ndk.java文件,从该文件开始引用live555库。 它包含:
package com.company.android.myapp;
public class Live555Ndk {
static {
System.loadLibrary("live555");
}
}
但是,我不知道如何开始创建对象实例并在live555库上调用方法,因为我有共享对象。 谁能指出我正确的方向?
感谢您的任何见解。
更新 02/15/2016
好的,我已根据mcwise的以下建议从app \\ build.gradle文件中删除了ndk {}
块。
我想我现在已经开始思考它是如何工作的,但我仍然无法引用live555库。 我用一个活动和相应的布局文件开始了一个新的Android项目。 我添加了一个jniLibs
文件夹,并将armeabi \\ liblive555.so等文件复制到该文件夹中。 我在前面提到的Live555Ndk.java文件中添加了静态构造函数并调用SystemloadLibrary("live555");
。 我还添加了对public native boolean isThisMediaSession();
的调用public native boolean isThisMediaSession();
。 然后我使用javah在jni
文件夹中生成头文件。 然后我创建了相应的.cpp文件来创建方法实现。 但是,我不能包含liblive555.so中的任何头文件。 这就像Android Studio甚至不知道live555库的存在。 所以,我不能有像#include <live555/MediaSession.hh>
这样的行。 我错过了一个额外的步骤吗? 这个Android项目只有.so文件,而不是源文件。 我是否需要将live555源添加到jni
文件夹?
查看Google开发的许多Android NDK示例。 你可以在这里找到它们。
hello-gl2示例是一个很好的起点。
gl_code.cpp向您展示了如何创建可以从Java调用的JNI代码。 特别注意代码的这一部分,它定义了两个方法并使它们对Java层可见:
extern "C" {
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env,
jobject obj, jint width, jint height);
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env,
jobject obj);
};
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj, jint width, jint height)
{
setupGraphics(width, height);
}
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj)
{
renderFrame();
}
GL2JNILib.java向您展示如何从Java调用gl_code.cpp中定义的方法。
public class GL2JNILib {
static {
System.loadLibrary("gl2jni");
}
/**
* @param width the current view width
* @param height the current view height
*/
public static native void init(int width, int height);
public static native void step();
}
更新:
要构建依赖live555库的C ++模块,您需要将以下部分添加到Android.mk:
include $(CLEAR_VARS)
LOCAL_MODULE := your_module
LOCAL_SRC_FILES := your_module_file.cpp
LOCAL_SHARED_LIBRARIES := live555
include $(BUILD_SHARED_LIBRARY)
请参阅此文档以供参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.