1. 程式人生 > >eclipse下安裝NDK開發jni

eclipse下安裝NDK開發jni

JNI與NDK:

     JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。從Java1.1開始,JNI標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他程式語言,只要呼叫約定受支援就可以了。使用java與本地已編譯的程式碼互動,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬體、作業系統進行互動,或者為了提高程式的效能。JNI標準至少要保證

原生代碼能工作在任何Java虛擬機器環境下。

     NDK即Native Development Kit,是一系列工具的集合。NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。NDK集成了交叉編譯器,並提供了相應的mk檔案隔離CPU、平臺、ABI等差異,開發人員只需要簡單修改mk檔案(指出“哪些檔案需要編譯”、“編譯特性要求”等),就可以創建出so。NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。

注:NDK自從r7版本以後,就不需要再去安裝Cygwin來使用NDK,開發人員可以利用ndk-build.cmd這個進行指令碼編譯。所以本文的安裝介紹基於最新的NDK版本的,不需要安裝Cygwin。

一、NDK環境的搭建

(1)下載ndk-r11(目前最新版)

(2)開啟Eclipse,新建一個Android工程(專案名NdkDemo),在工程目錄NdkDemo下新建jni資料夾,該資料夾就用來儲存NDK需要編譯的檔案程式碼等。

(3)開始新建並配置一個Builder

(a)Project->Properties->Builders->New,新建一個Builder。

(b)在彈出的【Choose configuration type】對話方塊,選擇【Program】,點選【OK】:
(c)在彈出的【Edit Configuration】對話方塊中,配置選項卡【Main】。
在“Name“中輸入新builders的名稱(名字自己決定,我命名為ndk_Builder)。

在“Location”中輸入nkd-build.cmd的路徑(這裡選擇你下載的ndk-r11的裡面的ndk-build.cmd路徑)根據各自的ndk路徑設定,也可以點選“Browser File System…”來選取這個路徑。
在“Working Diretcoty”中輸入NdkDemo位置(也可以點選“Browse Workspace”來選取NdkDemo目錄)。如圖1

圖1

(d)繼續在這個【Edit Configuration】對話方塊中,配置選項卡【Refresh】。如圖2
勾選“Refresh resources upon completion”,
勾選“The entire workspace”,
勾選“Recuresively include sub-folders”。


圖2

(e)繼續在【Edit Configuration】對話方塊中,配置選項卡【Build options】。
勾選“After a “Clean””,(勾選這個操作後,如果你想編譯ndk的時候,只需要clean一下專案 就開始交叉編譯)
勾選“During manual builds”,
勾選“During auto builds”,
勾選“Specify working set of relevant resources”。如圖3


圖3

點選“Specify Resource”按鈕,在彈開的對話方塊中勾選NdkDemo工程中新建的“jni“目錄,點選”finish“。 點選“OK“,完成配置。 如圖4


圖4

至此,編譯環境就建成功!

 二、Demo測試

 1.在NdkDemo工程中新建一個JniClient.java(為了呼叫C/C++程式碼),其內容如下:

package com.example.ndkdemo;

public class JniClient {
	static public native int AddInt(int a, int b);
}

2.生成 .h 的c++標頭檔案

(1)用cmd命令定位到JniClient.class 所在目錄,輸入“javac JniClient.java“後回車,生成JniClient.class檔案(如果是用的Eclipse建的工程,在TestNdk\bin\classes\com\example\ndkdemo目錄下就已經有JniClient.class檔案了)。

(2)將JniClinet.class拷貝到NdkDemo\bin\classes\com\example\ndkdemo目錄,將cmd命令定位到NdkDemo\bin\classes目錄,

輸入”javah com.example.ndkdemo.JniClient“後回車,在TestNdk\bin\classes目錄下就生成了C++標頭檔案com_example_ndkdemo_JniClient.h

com_example_ndkdemo_JniClient.h的檔案內容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ndkdemo_JniClient */

#ifndef _Included_com_example_ndkdemo_JniClient
#define _Included_com_example_ndkdemo_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_ndkdemo_JniClient
 * Method:    AddInt
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_ndkdemo_JniClient_AddInt
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

3.在jni資料夾下新建一個檔案Android.mk(這裡注意開頭大寫),內容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkDemo
LOCAL_SRC_FILES := com_example_ndkdemo_JniClient.c
include $(BUILD_SHARED_LIBRARY)

4. 將剛剛手動生成的com_example_ndkdemo_JniClient.h拷貝到NdkDemo工程的jni目錄下,

然後新建一個com_example_ndkdemo_JniClient.c檔案完成標頭檔案中函式的實現

com_ndk_test_JniClient.c的內容如下

#include "com_example_ndkdemo_JniClient.h"
#include <stdlib.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C"
{
#endif

/*
* Class:     com_example_ndkdemo_JniClient
* Method:    AddInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_ndkdemo_JniClient_AddInt
  (JNIEnv *env, jclass arg, jint a, jint b)
{
    return a + b;
}

#ifdef __cplusplus
}
#endif


此刻,當編輯com_example_ndkdemo_JniClient.c並儲存後,project下的—clean  一下工程,就可以看到NdkDemo工程下的obj/local/armeabi目錄下將自動生成libNdkDemo.so庫。

5.在MainActivity.java中完成對JniClient.java中函式的呼叫(首先靜態載入動態連結so庫):

package com.example.ndkdemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
        static {
        System.loadLibrary("NdkDemo");
     }
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        int iSum = JniClient.AddInt(11, 22);        
        String strSum = "11 + 22 = " + iSum;
        TextView tv = new TextView(this);
        tv.setText(strSum);
        setContentView(tv);
	}
}


6.執行NdkDemo工程,在模擬器中可以看到介面輸出來自com_example_ndkdemo_JniClient.c 檔案中的“11 + 22 = 33 "了。

 至此,NDK環境的安裝和demo就結束了。

 三、關於過程中java.lang.UnsatisfiedLinkError:報錯

這種情況基本上分為兩大類:

1、NDK環境安裝出錯(會導致在clean專案的時候,無法生成so檔案):

(a)ndk-build.cmd的路徑出現空格或者不合法字元

(b)新建Builder是未選擇Program

2、程式程式碼出錯:

(a)java與c++方法對應出錯

(b).h和.c檔案中,方法對應出錯,注意大小寫

(c)java方法傳遞引數出錯

(d)忘記加入System.loadLibrary();

相關推薦

eclipse安裝NDK開發jni

JNI與NDK:      JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。從Java1.1開始,JNI標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。

EclipseAndroid NDK開發環境搭建

第一步,下載ADT和NDK 最新的ADT(Android Development Tool)包含有ADT外掛及NDK外掛,不過對於ADT,官網已經不提供下載了,我們可以到第三方平臺下載,然後在Eclipse中進行安裝。 第二步,開啟Eclipse,點Wi

linux 安裝web開發環境

技術 cnblogs -- 時間日誌 java inux 協議 環境變量 含義 以下使用 linux centos系統 一、JDK的安裝 1、下載jdk-8u111-linux-x64.tar.gz 2、解壓該文件,將解壓後的文件復制到 /usr/local/jdk1.7

android -------- EclipseNDK配置環境

AR 註意 OS inf clip and per https Go NDK 全稱是Native Development Kit,是一個讓開發人員在Android應用中嵌入使用本地代碼編寫的組件的工具集 原生開發工具包 (NDK) 是一組可讓您在 Android 應用中利用

eclipse安裝和使用AmaterasUML、ModelSpoon生成Java類圖

ref img tps 工程 1.3 重新啟動 cts 文件夾 software tools Java 一. 安裝和使用AmaterasUML 安裝AmaterasUML前,需要先安裝GEF 1. GEF 采用eclipse在線安裝方式安裝就好。eclipse在線安

Windows安裝PHP開發環境

說明 zip 系統 () html fin php zip 官網 安裝配置 一、Apache 因為Apache官網只提供源代碼,如果要使用必須得自己編譯,這裏我選擇第三方安裝包Apache Lounge。 進入Apachelounge官方下載地址:http://www.a

eclipse安裝genymotion外掛

(一)在eclipse下安裝genymotion外掛 啟動eclipse,選擇Help->Install New Software選單     點選add按鈕      填入Ge

Linux-Centos安裝java開發環境

1. 升級包  yum -y upgrade 2. 安裝java8 yum -y install java-1.8.0-openjdk*  3. 以下為相關指令 檢視CentOS自帶JDK是否已安裝:yum list installed | gr

eclipse安裝lombok

lombok官網:https://projectlombok.org/  安裝lombok可以在實體類中通過註解的方式,不需要寫get和set方法,簡單方便 安裝lombok有倆種辦法 第一種 1.下載 lombok.jar  2.安裝  (1)將l

mac安裝c++開發環境

mac下安裝c++開發環境 1 註冊apple id   按照apple註冊步驟註冊apple id,我註冊時遇到如下問題 apple store完成建立apple id步驟中,選擇付款方式和賬單地址後,總會提示“如需幫助,請聯絡itune支援”,進而導致apple store無法下載軟體

Windows安裝Julia開發環境

    Julia 是一個面向科學計算的高效能動態高階程式設計語言。其語法與其他科學計算語言相似。在許多情況下擁有能與編譯型語言相媲美的效能。Julia 是個靈活的動態語言,適合科學和數值計算,效能可與傳統靜態型別語言媲美。特點如下: 免費開源 核

CentOS7 64位安裝基礎開發環境之JDK篇

一. 安裝JDK 1.1 準備工作 確保系統中沒有其它已安裝的jdk,輸入命令:rpm -qa | grep java,如果有,使用命令rpm -e --nodeps 解除安裝已安裝的jdk 切換到root使用者並進入usr目錄: cd /usr 在usr目錄下建

CentOS7 64位安裝基礎開發環境之Tomcat篇

安裝Tomcat 注意:關閉防火牆 2.1 準備工作 1、 切換到/usr下:cd /usr/software 2、 建立tomcat目錄:mkdir tomcat 3、 進入tomcat的目錄中:/usr/software/tomcat 2.2 安裝步驟 上傳t

CentOS7 64位安裝基礎開發環境之MySQL篇

安裝MySQL 1 解除安裝CentOS7自帶的mariadb資料庫 檢視是否有自帶的mariadb: rpm -qa | grep mariadb 解除安裝自帶的mariadb資料庫 刪除:rpm -e --nodeps mariadb-libs-5.5.56

EclipseJava Card開發總結

近來專案要做CPU卡的開發,如果用真實的CPU卡測試,多次操作錯誤後卡會被鎖死,既浪費資源也不利於開發。因此想到是否有模擬的智慧卡操作呢,網上一搜還真有,用Java模擬智慧卡,叫做“Java Card”開發。 環境搭建 網上介紹的資料比較亂,大體歸納起來主要是給Eclipse安

Windows安裝Go開發環境

1) 下載msi安裝檔案,選擇和自己系統相匹配的msi,區分32/64,建議選擇msi格式的,懶得手動配置環境變數; 2) msi下載完成後,開啟msi檔案,傻瓜式安裝(一直next),直至結束; 3)測試是否安裝成功:cmd命令下,輸入 go version 或

eclipse安裝外掛Lombok

一、Lombok是什麼Lombok是一款小巧的程式碼生成工具。官方網址:http://projectlombok.org/ LomBok主要特性有:自動生成預設的getter/setter方法、自動化的資源管理(通過@Cleanup註解)及註解驅動的異常處理等。目前在國外廣

demo開發之問題3在ubuntu安裝C++開發環境

轉載於https://itsfoss.com/c-plus-plus-ubuntu/  向大佬致敬 一、C++開發環境的安裝。 1. 安裝build-essential package sudo apt-get install build-essential you mus

在Windows 7/8/10安裝Python開發環境 以及對git的理解與簡易使用

在Windows 7/8/10下安裝Python開發環境 1. 裝Lantern等軟體翻牆 2. 安裝Python(Python installer 帶有一個低版本的Pip)。確保普通使用者對Python安裝在C盤的路徑,有寫許可權。

開源BI報表及OLAP多維分析平臺OPENI(二)—搭建Eclipse的Openi開發環境

接著上節的demo來看如何在Eclipse下搭建Openi的開發及除錯環境. 一.下載openi-1.3.0-RELEASE-src 二.新建web project 在MyEclipse下新建web project:openi 1.openi-1.3.0-RELE