1. 程式人生 > >android 淺嘗JNI 打包so庫

android 淺嘗JNI 打包so庫

接觸安卓有一段時間了,一直沒有時間或者說自己沒有主動去練習一些jni,今天就來分享一下jni的過程、步驟
我用的環境是studio jdk1.8
1:下載ndk 地址自行百度 安裝完成後配置環境變數
這裡寫圖片描述這裡寫圖片描述
2:AS新建一個專案,然後開啟設定 配置一下ndk路徑
這裡寫圖片描述
然後配置一下gradle檔案 如圖
這裡寫圖片描述
3: 這時候開始編寫程式碼了,如下圖
這裡寫圖片描述
不擅長文字描述,多用圖片,大家別介意,重點來了:
4: 命令列進入剛才編寫的NativeTest檔案路徑 javac 類名.java生成javac檔案 如圖:
這裡寫圖片描述
然後開始編譯生成.h標頭檔案 javah 包名.類名看下圖 注意命令列目錄位置:這裡寫圖片描述


5:有了標頭檔案 接下來要建立jni目錄 編寫c程式碼了 步驟 如圖:

這裡寫圖片描述 直接點finish就好 然後複製剛才的.h標頭檔案到這個目錄裡面 如圖:
這裡寫圖片描述
這時候建立一個.c檔案 開始編寫c程式碼了 如圖:
這裡寫圖片描述
這裡寫圖片描述
好了 開始編寫c程式碼 在剛剛建立的.c檔案編寫 先引入.h標頭檔案:

#include <com_ndktest_NativeTest.h>`

下一步 重寫.h標頭檔案的方法:

//
// Created by Administrator on 2017/9/14 0014.
//
#include <com_ndktest_NativeTest.h>
JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getHint
        (JNIEnv *env, jclass
obj){
return (*env)->NewStringUTF(env,"簡單的方法返回值 ,不傳引數"); } JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getToastInfo (JNIEnv *env, jclass o, jstring s){ return s; }

配置一下等下要生成的so名字 架構:

這裡寫圖片描述
接下來 在剛才的cpp目錄 建立 Android.mk檔案 用於編寫so的一些配置:
這裡寫圖片描述
還有一個Application.mk檔案:
這裡寫圖片描述重點來了;開始打包so庫
7: 命令如下圖:
這裡寫圖片描述

大功完成99,還差最後一點點 註釋掉剛才build裡的這幾句話 刪除也可以:

 ndk {
            moduleName "test"//指定生成的so檔名
            abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的型別
        }

        sourceSets.main {
            jni.srcDirs = ['libs']
        }

然後在專案的main目錄新建一個jniLibs目錄 拷貝libs裡的全部架構進去,刪除libs obj jni目錄檔案 當然,你喜歡 也可以複製到其他地方儲存
這裡寫圖片描述
最後一步了 我們回到一開始編寫的NativeTest.java類裡面 初始化一下我們打包的so庫:

package com.ndktest;


public class NativeTest {
    static {
        System.loadLibrary("test");
    }

    public static native String getHint();

    public static native String getToastInfo(String values);
}

然後可以去呼叫這個類的方法了 :

package com.ndktest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this,
                "jni返回的提示:" + NativeTest.getHint() + " 傳過去的引數: "
                        + NativeTest.getToastInfo("sdadasda"),
                Toast.LENGTH_SHORT).show();
        Log.e("jni返回的提示",NativeTest.getHint());
        Log.e("傳過去的引數",NativeTest.getToastInfo("sdadasda"));
    }
}

這裡寫圖片描述這裡寫圖片描述
好了,本文到這裡結束了,希望大家喜歡;
ps:在.c裡面返回字串的時候 使用這個NewStringUTF 請注意,如果你在java裡傳過去的是字串 ,請別用NewStringUTF 進行編碼 會報錯,解決方法兩個 1:不使用NewStringUTF ,原樣返回值,2 :對傳過來的java字串進行轉碼,比較麻煩,自行百度。如有疑問請郵件留言 [email protected]

相關推薦

android JNI 打包so

接觸安卓有一段時間了,一直沒有時間或者說自己沒有主動去練習一些jni,今天就來分享一下jni的過程、步驟 我用的環境是studio jdk1.8 1:下載ndk 地址自行百度 安裝完成後配置環境變數 2:AS新建一個專案,然後開啟設定 配置一下

Android原始碼中如何吧so打包編譯進入apk, 整合第三方(jar和so

整合第三方so和jar包 include $(CLEAR_VARS) #jar包編譯            LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=securitysdk:libs/hello.jar #64和32系統選擇不同的庫 if

Android Studio JNI生成so

JNI生成so檔案 1.新建Android studio工程 2.新建class:AppKey.java.主要為了儲存金鑰 程式碼塊 package com...admina

Ubuntu下編譯android所需ffmpeg的so

編譯ffmpeg原始碼 環境說明 環境(包括版本)儘量下面的保持一致,其他環境不一定能成功。 系統: Ubuntu16.04 LTS 最好不要再windows系統下編譯,可在windows中安裝VMware虛擬一個linux系統出來,對linux

android studio中使用第三方so(終結版)

    安卓開發中,經常會用到第三方C++庫,然後不知道是我對系統不熟悉的原因,還是安卓支援C++開發本來就比較弱,反正其中踩了很多坑。     android studio 版本 3.0.1,  在PC上安裝android studio3.1.2,就是配置不成功,後面再筆

android使用C/C++呼叫SO

轉載來源:http://biancheng.dnbcw.info/shouji/400358.html 有時候,我們反編譯apk得到一個so庫,如果直接使用這個so庫的話,必須使用原來so庫同樣的package名字,才能用。 這樣人家反編譯你的apk,就知道你侵犯了人家

android 通過Android.mk將三方的so編譯到apk裡

在網上找了好多沒有一個能解決此問題,於是自己分析其原理自己寫了一個Android.mk檔案。通過實驗可以將三方的os庫編譯到apk包裡,編譯完生成的apk包你開啟會看到有個libs目錄,so庫就放在libs/armeabi目錄下,下面是Android.mk檔案的寫法 寫法一

android開發ndk呼叫第三方so

1.0 功能概述 1.0.1 概述 在android開發中,java呼叫C/C++函式庫是經常遇到的,我們的android開發中使用JNI開發技術,有下面幾種情況: 已經使用C/C++發了某些函式庫,如果再使用java封裝相應的函式庫的話,可能會話費

Android Studio之正確匯入SO

Android Studio之正確匯入SO相關檔案 之前一直沒有做過第三方的推送訊息,這次公司要求採用國內極光第三方推送服務,由於專案還在原型圖構思中,因而還可以花點時間看看這方面的東西。 看了下相關的DEMO,挺簡單的,加點許可權,把相關的廣播以及服務

JNI入門教程1---Android studio 下JNI程式設計例項並生成so

參考地址: https://www.cnblogs.com/jymblog/p/5526865.html                   https://www.jianshu.com/p/a

Android平臺下JNI呼叫第三方so

 首先說一下在網上查詢資料時,對於呼叫第三方so庫,有人說有兩種方法: 1.    對於so庫的API符合JNI格式(即使用javah指令生成的標頭檔案中那種格式),可以在Java程式碼中宣告它對應的native方法,直接調  用。 &

Android so 按需打包

Fresco 大部分的程式碼是由Java寫的,但是裡面也有很多C++的程式碼。C++程式碼必須根據Android 裝置的CPU型別(通常稱為”ABIs”)進行編譯。目前Fresco支援五種 ABI: armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以後的生產的大部分Andr

Android 靜態和動態的呼叫soJNI

優點 為什麼我們需要動態載入?因為靜態載入中CPU的資料夾我們可能需要相容的話需要放在不同arm資料夾下,那麼就會導致apk 包體過大,還有安卓Android SDK系統版本導致的差異,所以我們採用動態載入 so 庫檔案的話最主要的好處就是可以減小

Android JNI以及打包so檔案到apk中

W/dalvikvm( 5177): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/miui/userbook/util/Patcher; W/dalvikvm( 5177): threadid=12: th

JNI開發(一) 簡單的C程式碼打包SO以及專案如何呼叫SO

前段時間開發過程中用到了簡單的JNI使用,當時發現很多網上文章總有這樣那樣的問題,最近趁時間充裕就記錄下來,以供記憶和交流。 JNI環境配置 這裡就不做多講,百度一下,把腳跨過牆就好。 寫

android Jni編譯多平臺so

前兩天換了個x64晶片的手機,發現公司APP在上面閃退,原因是找不上x64的庫 首先我吧預設的so庫賦值到目錄arm64-v8a 重新開啟,報錯原因是改庫非64位的庫 然後我打開了以前的JNI開發專案,搜尋相關解決方案,最終找到解決方案。 開啟JnI目錄下的Applicat

android 調用c文件生成so並調用

dem ges classes lib fault rms img div 節點 公司需要做一個sdk,裏面需要用到別人寫的c文件,第一次做,各種百度,各種學習,現在做一個小總結: 一、新建一個project:例 ExampleDemo, 包名為:com.demo.exam

Android Studio2.2.3 通過JNI引用ffmpeg小結

android studio;ffmpeg;ndk;jni修改步驟:首先通過NDK14編譯出libffmpeg.so ,將include目錄取出通過AS建立基於jni的工程項目,將include目錄放到cpp下;創建jniLibs/armeabi目錄,將libffmpeg.so放到裏邊 3.配置CMak

Android Studio指定引用jnilibs 特定CPU架構的so文件

文件 jni adl 性能 沒有 1.2 x86_64 apk andro 稍微大一些的項目都會用到第三方庫,所以不可避免的會有針對不同手機cpu架構的.so庫文件 ‘x86‘, ‘x86_64‘, ‘mips‘, ‘mips64‘ ‘armeabi‘ ,‘armeab

關於多個名字相同的.so打包

es2017 定位 red 文件 ima oid 添加 andro img 1.修改Andriod.mk下的.a文件的配置(如百度定位的SDK) 2.修改Application.mk 這裏只是寫了默認的和V7a需要其他 的按照這個格式添加即可;(有的也許需要將APP_A