- Windows 8.1 64位
- Oracle JDK 1.8
- Android Studio 1.5.1
- Gradle 1.5.0
- Build Tools 23.0.2
- Create a standard Android application using Android Studio.
- Right click on the app module in the Project explorer and choose New | Folder | JNI Folder from the context menu.
- Download the live555 sources from http://www.live555.com/liveMedia/public/ selecting the live555-latest.tar.gz file.
- Extract the sources to the JNI folder, such that you now have a folder structure like:
$PROJECT_DIR
|--app
|--|--src
|--|--|--main
|--|--|--|--jni
|--|--|--|--|--live
where the live folder contains the live555 sources. Inside the
jni
folder above, create theAndroid.mk
andApplication.mk
files. TheApplication.mk
file contains:APP_OPTM := release APP_ABI := armeabi armeabi-v7a APP_PLATFORM := android-21 APP_STL := stlport_shared
The
Android.mk
file contains: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)
In my
$PROJECT_DIR\gradle.properties
file, I've included the lineandroid.useDeprecatedNdk=true
In
$PROJECT_DIR\local.properties
, I have:ndk.dir=C\:\\Users\\user\\AppData\\Local\\Android\\ndk sdk.dir=C\:\\Users\\user\\AppData\\Local\\Android\\sdk
In my
$PROJECT_DIR\app\build.gradle
file I have: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' }
I then run
ndk-build
in the$PROJECT_DIR\app\src\main\jni
folder.
ndk-build
命令会生成以下文件夹结构/文件输出:$PROJECT_DIR
|--app
|--|--src
|--|--|--main
|--|--|--|--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 | Make Project 菜单选项构建项目时,Android 视图中的项目结构如下所示:
app
|--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();
的语句。然后,我使用javah生成了一个位于jni
文件夹内的头文件。然后我创建了相应的.cpp文件来创建方法实现。然而,我不能包含来自liblive555.so的任何头文件。就像Android Studio甚至没有意识到live555库的存在一样。因此,我不能有像#include <live555/MediaSession.hh>
这样的语句。我错过了其他步骤吗?这个Android项目只有.so文件,没有源代码。我需要将live555源代码添加到jni
文件夹中吗?
ldLibs.addAll(["log", "GLESv2"])
添加到android.ndk {}
块中,而gradle就知道从哪里获取这些库,更重要的是头文件。我该如何才能在访问live555库的.cpp文件中说#include "MediaSession.hh"
? - Rob Droid