PJSIP2.8 下載地址https://www.pjsip.org/download.htm
sdk更新 安卓26
ndk用 android-ndk-r15c
你要覺得麻煩或難解決錯誤可到https://item.taobao.com/item.htm?id=591748792847獲取源碼。源碼功能性更好、更完善。
想測試apk請加羣261074724
=>官方編譯說明
https://trac.pjsip.org/repos/wiki/Getting-Started/Android
1.創建文件:vim pjlib/include/pj/config_site.h
#define PJ_CONFIG_ANDROID 1
#include <pj/config_site_sample.h>
2.NDK_TOOLCHAIN_VERSION=4.9 APP_PLATFORM=android-26 TARGET_ABI=arm64-v8a ./configure-android --use-ndk-cflags
make dep && make clean && make
cd pjsip-apps/src/swig=> make
3.把pjsip-apps/src/swig/java/android 項目東西考出來
4.創建一個安卓項目基於8的 包含c++的
創建一個模塊包pjsua 把主工程的CMakeLists.txt 及build.gradle裏的
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'arm64-v8a'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
移到模塊下 主工程去掉這些 同時頁面main裏的cpp移過去
在src /main下的創建一個目錄jniLibs/arm64-v8a 導入libpjsua2.so
在cmakelist.txt添加
add_library( libpjsua2 SHARED IMPORTED)
set_target_properties( libpjsua2
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpjsua2.so)
target_link_libraries( # Specifies the target library.
native-lib
libpjsua2
# Links the target library to the log library
# included in the NDK.
${log-lib} )
在java目錄導入包 除了app裏的activity 同時吧MyApp類改成public 裏面的類我把它考到了my裏 結果如下
好了在主工程的佈局文件添加一個按鈕點擊註冊並添加權限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在oncreate 添加
if (PermissionsUtil.hasPermission(this, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission. CAMERA ,Manifest.permission. PROCESS_OUTGOING_CALLS ,Manifest.permission. READ_PHONE_STATE ,Manifest.permission. WRITE_EXTERNAL_STORAGE })) {
//有
start();
} else {
PermissionsUtil.requestPermission(this, new PermissionListener() {
public void permissionGranted(@NonNull String[] permissions) {
//用戶授予了
start();
}
public void permissionDenied(@NonNull String[] permissions) {
//用戶拒絕了訪問攝像頭的申請
Toast.makeText(MainActivity.this, "您沒有授權將無法啓用網絡電話!", Toast.LENGTH_LONG).show();
}
}, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission. CAMERA ,Manifest.permission. PROCESS_OUTGOING_CALLS ,Manifest.permission. READ_PHONE_STATE ,Manifest.permission. WRITE_EXTERNAL_STORAGE });
}
private void start() {
if (app == null) {
app = new MyApp();
/**Wait for GDB to init, for native debugging only
if (false && (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0)
{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
}**/
app.init(this, getFilesDir().getAbsolutePath());
}
}
這塊是初始化的可以參考編譯生成項目的actity
在點擊按鈕添加
accCfg = new AccountConfig();
accCfg.setIdUri("sip:"+username+"@"+ipport);
accCfg.getRegConfig().setRegistrarUri("sip:"+username+"@"+ipport);
AuthCredInfoVector creds = accCfg.getSipConfig(). getAuthCreds();
creds.clear();
creds.add(new AuthCredInfo("Digest", "*", username, 0, password));
StringVector proxies = accCfg.getSipConfig().getProxies();
proxies.clear();
// proxies.add(proxy);
/* Enable ICE */
//accCfg.getNatConfig().setIceEnabled(true);
//accCfg.getVideoConfig( ).setAutoTransmitOutgoing(false );
accCfg.getVideoConfig( ).setAutoShowIncoming(true);
try {
for(MyAccount m : app.accList){
app.delAcc(m);
}
account = app.addAcc(accCfg);
account.modify(accCfg);
} catch (Exception e) {}
並且讓actity實現MyAppObserver
好了 現在就可以點擊註冊 註冊成功後在現實的方法添加輸出
@Override
public void notifyRegState(pjsip_status_code code, String reason, int expiration) {
Log.e("notifyRegState",""+reason);
if( code==pjsip_status_code. PJSIP_SC_OK){
CodecInfoVector a = MyApp.ep.codecEnum();
String audioinfo = "";
for( int i=0;i<a.size() ;i++ ){ //可用編碼輸出
CodecInfo x= a.get(i);
audioinfo+=x.getCodecId()+"("+x.getPriority()+")_";
}
}
好了 其他的參考編譯的項目的actity了
後面將會講到gcb729、opus、h264的編譯
交流羣261074724
linphone 版教程https://blog.csdn.net/Java_lilin/article/details/80539116