1. 程式人生 > >超詳細的JNI(NDK)入門與使用

超詳細的JNI(NDK)入門與使用

步驟1:建立一個Android應用。

步驟2:寫Java中需要用到的native函式。  

public class JNI {
    public native int getCInt();
    public native String getCString();
}  

步驟3:儲存並自動編譯成.class檔案。

步驟4:開啟cmd,將工作路徑切換<Project>/bin/classes/。在編譯時要加上包名,例子:javah -jni [包名].[類名]。

步驟5:在工程目錄下新建jni資料夾,把上面產生的.h檔案拷貝過去,並以jni資料夾新建一個C++工程。

注意:工程有時候找不到標頭檔案時,需要手動新增。

C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++\i686-pc-cygwin
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++\backward
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include-fixed
C:\cygwin\usr\include
C:\cygwin\usr\include\w32api

JNI的位置:${NDKROOT}/platforms/android-9/arch-arm/usr/include

步驟6:編寫c/c++檔案:

複製程式碼
#include <stdio.h>
#include <stdlib.h>

#include "com_example_com_ndk_JNI.h"

int add2()
{
    int x,y;
    x=1000;
    y=8989;
    x+=y;
    return x;

}

/*
 * Class:     com_example_com_ndk_JNI
 * Method:    getCInt
 * Signature: ()I
 
*/ JNIEXPORT jint JNICALL Java_com_example_com_ndk_JNI_getCInt (JNIEnv *env, jobject thiz) { return add2(); } /* * Class: com_example_com_ndk_JNI * Method: getCString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_com_ndk_JNI_getCString (JNIEnv *env, jobject thiz) { (*env)->NewStringUTF(env,"Hello NDK---->> "); }
複製程式碼

注意:編輯之後,函式為(JNIEnv *, jobject)只有引數型別沒有引數變數,請改為(JNIEnv *env, jobject thiz)

步驟7:編譯之前要寫2個.mk格式的檔案。

第一個.mk檔案是Android.mk檔案,這個檔案放在jni目錄下,內容為:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := HelloNDK
LOCAL_SRC_FILES := com_example_com_ndk_JNI.c

include $(BUILD_SHARED_LIBRARY)

第一句話是寫明c/c++檔案的路徑
第二句話是清空
第三句話是專案的名稱
第四句話是原始檔的名稱
第五句話是指編輯成共享的庫(.so)

另一個是Application.mk,這個檔案也放在jni目錄下,內容為:

APP_PROJECT_PATH := $(call my-dir)/..
APP_MODULE := HelloNDK

第一句是你的專案的路徑。

步驟8:開啟Cygwin,進入到專案根目錄,執行$NDK\ndk-build生成so庫。

  生成的so庫會自動儲存在libs資料夾裡。

步驟9:編寫Android程式,載入so庫。方式為定義一個static塊,載入庫檔案System.loadLibrary("庫名")。

複製程式碼
import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

    static{
        System.loadLibrary("HelloNDK");
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JNI jni= new JNI();
        
        TextView textView=(TextView)findViewById(R.id.tvHello);
        textView.setText(jni.getCString()+Integer.toString(jni.getCInt()));
        
    }
}
複製程式碼

步驟10:執行Android程式。  

PS1:可以在Eclipse裡面直接編譯成so庫而不用開啟Cygwin

步驟1:

步驟2:進入工程屬性頁,build command設定為ndk下ndk-build的完整路徑。

PS2:

如果你不需要使用NDK開發,只是需要使用第三方用NDK開發的庫,那麼你只需要這樣做:把第三方提供的libxxx.so放到你的<project>/libs/armeabi/下, 然後在程式隨便什麼地方中加入
static {
    System.loadLibray("xxx");
}
就可以使用該庫了。

相關推薦

詳細JNINDK入門使用

步驟1:建立一個Android應用。 步驟2:寫Java中需要用到的native函式。   public class JNI { public native int getCInt(); public native String getCStri

大數據入門第十九天——推薦系統mahout入門概述

tps font 解決 技術分享 tar nbsp mage cnblogs clas 一、推薦系統概述   為了解決信息過載和用戶無明確需求的問題,找到用戶感興趣的物品,才有了個性化推薦系統。其實,解決信息過載的問題,代表性的解決方案是分類目錄和搜索引擎,如hao123

機器學習筆試面試詳細總結

51、概率和資訊量的關係 示例: 符號集 a 、 b 、 c 、 d ,它們相互獨立,相應概率為 1/2 、 1/4 、 1/8/ 、 1/16 ,其中包含資訊量最小的符號(a) 解析: 訊息出現的概率越小,說明限制條件越多,則訊息中所包含的資訊量就越大;

開放分散式追蹤OpenTracing入門 Jaeger 實現

分散式系統的運維挑戰容器、Serverless 程式設計方式的誕生極大提升了軟體交付與部署的效率。在架構的演化過程中,可以看到兩個變化:應用架構開始從單體系統逐步轉變為微服務,其中的業務邏輯隨之而來就會變成微服務之間的呼叫與請求。資源角度來看,傳統伺服器這個物理單位也逐漸淡化,變成了看不見摸不到的虛擬資源模式

WebRTC VideoEngine詳細教程——整合OPENH264編解碼器

http://blog.csdn.net/nonmarking/article/details/47910043 本系列目前共三篇文章,後續還會更新 總述 WebRTC原生支援VP8和VP9,但也可以自行整合H264編解碼器,比較常見

SpringCloud+MyBatis+Redis整合—— 詳細例項

SpringCloud+MyBatis+Redis整合—— 超詳細例項(一) 1、SpringCloud+MyBatis   MyBatis 是一款優秀的輕量級半自動持久層框架,與之相對應的還有hibernate框架。①     話不多說,接下來搭建SpringClo

泛型詳細解讀:泛型基礎

一:什麼是泛型 泛型是jdk5才引進的,泛型其實指得就是引數化型別,使得程式碼可以適應多種型別。像容器,List< T >,大量使用了泛型,它的主要目的之一就是用來指定容器要持有什麼型別的物件。我認為,泛型的好處很多: 1.保證了型別安全

PHPstorm+XDebug+Chrome/Firefox詳細教程圖文

ace 項目 span 時間 php 圖片 lan framework 但是   相信習慣了var_dump調試的小朋友是很少使用debug的,博主就是其中的一個,但是var_dump能調試的項目大多是層次分明,結構清晰的,一旦拿到一個新項目,框架結構層次又很深的話,通過v

《Java語言程式設計Java7——入門提高篇》內容簡介

        本書共分6章。第1章是Java語言快速入門,讓讀者對程式語言和Java語言有初步的認識,能夠使用整合開發環境編寫出自己的第一個程式。第2章是對基本編碼能力的培養,包括基本資料型別、各種運算子、流程控制、方法和陣列。第3章是面向物件程式設計基礎,介紹瞭如何編寫類以及如何建立物件,並介紹了物件陣列

【cocos2dx 3.2】Flappy Bird開發詳細講解主角小鳥的建立

本文可以隨意轉載,轉載請註明出處,謝謝! 像之前我們說的,GameLayer是管家,其他的東西(小鳥,管道,草地等)各自封裝成類。現在我們就把主角小鳥封裝成一個類。 在這裡我們先思考下,我們有三種不同顏色的小鳥,在預載入LoadingScene裡我們給它們初始化了各自的動

【Android】AndroidStudio編寫外掛詳細教程

AndroidStudio外掛超詳細教程(一) 本教程從0開始,邊探索邊講解思路,保證詳細~~~寫的時候發現有點長,準備分2-3次寫完吧。 最近專案試了一下Android元件化架構,感覺坑還是蠻多的,首先ButterKnife就用不了了,

cs229 斯坦福機器學習筆記-- 入門LR模型

房價 com 還要 實現 最大 title pid 分布 fcm 版權聲明:本文為博主原創文章,轉載請註明出處。

C#刷遍Leetcode面試題系列連載1 - 入門工具簡介

目錄 為什麼要刷LeetCode 刷LeetCode有哪些好處? LeetCode vs 傳統的 OJ LeetCode刷題時的心態建設 C#如何刷遍LeetCode 選項1:

Android自助餐之JniNDK入門

Android自助餐之Jni(六)NDK入門 Android自助餐之Jni六NDK入門 Android自助餐專欄 Android自助餐之Jni一最簡單的執行 Android自助

ThinkJS框架入門詳細教程開發環境

install devel 版本 開發 conf doc 瀏覽器 打開 變量 一、前端標配環境 1、nodeJS正確安裝,可以參考:http://www.cnblogs.com/chengxs/p/6221393.html 2、git正確安裝,可以參考:http://w

ThinkJS框架入門詳細教程新手入門項目

logs connect 項目 目錄 itl 合並 sql文件 生產 js框架 一、準備工作 參考前一篇:ThinkJS框架入門詳細教程(一)開發環境 安裝thinkJS命令 npm install -g think-cli 監測是否安裝成功 thin

Android GIS開發系列-- 入門8 JsonGeometry的相互轉換

相互轉換 them 實用 興趣 parse 執行 pretty pre andro 在Android中json數據十分普遍,也很實用,在Arcgis中也同樣支持Json數據,Json與Geometry可以相互轉換,達到我們想要的數據。 一、Geometry轉換成Json數

Oracle入門第一天——簡介安裝

http 添加數據 system 第一個 上網 操作 develop 窗口 style 一、Oracle介紹    Oracle 公司是全球最大的信息管理軟件及服務供應商,成立於1977年   Oracle 公司因其復雜的關系數據庫產品而聞名。Oracle的關系數據庫是

Python3入門——概述環境安裝

知乎 沒有 color https oob 環境 bsp 風格 初級 一、概述   1.python是什麽     Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。 Python 是一種解釋型語言: 這意味著開發過程中沒有了編

kaggle入門項目:Titanic存亡預測驗證實現

tps 多參數 name 出了 運算 處理 defaults purpose sof 原kaggle比賽地址:https://www.kaggle.com/c/titanic 原kernel地址:A Data Science Framework: To Achieve 99