欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

android與jni,什么是android

Android開發(fā),關于jni的一些問題

CPU/ABI 也就是處理器 因為不同的手機廠商會使用不同的處理器

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)黔江免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。

那么 就是 把需要編譯的。so文件放在arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64 這些目錄下 但是so文件 32位的放在armeabi、armeabi-v7a、mips、mips64、x86、這些目錄下 64位的so文件放在arm64-v8a下 不然會造成 找不到

so文件等異常

如何在Android下使用JNI

 第一步:

使用Java編寫HelloWorld 的Android應用程序:

復制代碼

package com.lucyfyr;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class HelloWorld extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.v("dufresne", printJNI("I am HelloWorld Activity"));

}

static

{

//加載庫文件

System.loadLibrary("HelloWorldJni");

}

//聲明原生函數(shù) 參數(shù)為String類型 返回類型為String

private native String printJNI(String inputStr);

}

復制代碼

這一步我們可以使用eclipse來生成一個App;

因為eclipse會自動為我們編譯此Java文件,后面要是用到。

第二步:

生成共享庫的頭文件:

進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/ 下:

可以看到里面后很多后綴為.class的文件,就是eclipse為我們自動編譯好了的java文件,其中就有:

HelloWorld.class文件。

退回到classes一級目錄:/HelloWorld/bin/classes/

執(zhí)行如下命令:

javah com.lucyfyr.HelloWorld

生成文件:com_lucyfyr_HelloWorld.h

復制代碼

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class com_lucyfyr_HelloWorld */

#ifndef _Included_com_lucyfyr_HelloWorld

#define _Included_com_lucyfyr_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_lucyfyr_HelloWorld

* Method: printJNI

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

復制代碼

可以看到自動生成對應的函數(shù):Java_com_lucyfyr_HelloWorld_printJNI

Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 接口名(printJNI):必須要按此JNI規(guī)范來操作;

java虛擬機就可以在com.simon.HelloWorld類調(diào)用printJNI接口的時候自動找到這個C實現(xiàn)的Native函數(shù)調(diào)用。

當然函數(shù)名太長,可以在.c文件中通過函數(shù)名映射表來實現(xiàn)簡化。

第三步:

實現(xiàn)JNI原生函數(shù)源文件:

新建com_lucyfyr_HelloWorld.c文件:

復制代碼

#include jni.h

#define LOG_TAG "HelloWorld"

#include utils/Log.h

/* Native interface, it will be call in java code */

JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)

{

LOGI("dufresne Hello World From libhelloworld.so!");

// 從 instring 字符串取得指向字符串 UTF 編碼的指針

const char *str =

(const char *)(*env)-GetStringUTFChars( env,inputStr, JNI_FALSE );

LOGI("dufresne---%s",(const char *)str);

// 通知虛擬機本地代碼不再需要通過 str 訪問 Java 字符串。

(*env)-ReleaseStringUTFChars(env, inputStr, (const char *)str );

return (*env)-NewStringUTF(env, "Hello World! I am Native interface");

}

/* This function will be call when the library first be load.

* You can do some init in the libray. return which version jni it support.

*/

jint JNI_OnLoad(JavaVM* vm, void* reserved)

{

void *venv;

LOGI("dufresne-----JNI_OnLoad!");

if ((*vm)-GetEnv(vm, (void**)venv, JNI_VERSION_1_4) != JNI_OK) {

LOGE("dufresne---ERROR: GetEnv failed");

return -1;

}

return JNI_VERSION_1_4;

}

復制代碼

OnLoadJava_com_lucyfyr_HelloWorld_printJNI

函數(shù)里面做一些log輸出 注意JNI中的log輸出的不同。

JNI_OnLoad函數(shù)JNI規(guī)范定義的,當共享庫第一次被加載的時候會被回調(diào),

這個函數(shù)里面可以進行一些初始化工作,比如注冊函數(shù)映射表,緩存一些變量等,

最后返回當前環(huán)境所支持的JNI環(huán)境。本例只是簡單的返回當前JNI環(huán)境。

第四步:

編譯生成so庫

編譯com_lucyfyr_HelloWorld.c成so庫可以和app一起編譯,也可以都單獨編譯。

在當前目錄下建立jni文件夾:HelloWorld/jni/

下建立Android.mk ,并將com_lucyfyr_HelloWorld.c和 com_lucyfyr_HelloWorld.h 拷貝到進去

編寫編譯生成so庫的Android.mk文件:

復制代碼

LOCAL_PATH:= $(call my-dir)

# 一個完整模塊編譯

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=com_lucyfyr_HelloWorld.c

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)

LOCAL_MODULE := libHelloWorldJni

LOCAL_SHARED_LIBRARIES := libutils

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE_TAGS :=optional

include $(BUILD_SHARED_LIBRARY)

復制代碼

系統(tǒng)變量解析:

LOCAL_PATH - 編譯時的目錄

$(call 目錄,目錄….) 目錄引入操作符

如該目錄下有個文件夾名稱 src,則可以這樣寫 $(call src),那么就會得到 src 目錄的完整路徑

include $(CLEAR_VARS) -清除之前的一些系統(tǒng)變量

LOCAL_MODULE - 編譯生成的目標對象

LOCAL_SRC_FILES - 編譯的源文件

LOCAL_C_INCLUDES - 需要包含的頭文件目錄

LOCAL_SHARED_LIBRARIES - 鏈接時需要的外部庫

LOCAL_PRELINK_MODULE - 是否需要prelink處理

include$(BUILD_SHARED_LIBRARY) - 指明要編譯成動態(tài)庫

android 怎么調(diào)用jni里面的方法

調(diào)用jni里面的方法,過程如下:

第一步:

使用Java編寫HelloWorld 的Android應用程序:

package com.lucyfyr;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class HelloWorld extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.v("dufresne", printJNI("I am HelloWorld Activity"));

}

static

{

//加載庫文件

System.loadLibrary("HelloWorldJni");

}

//聲明原生函數(shù) 參數(shù)為String類型 返回類型為String

private native String printJNI(String inputStr);

}

這一步我們可以使用eclipse來生成一個App;

因為eclipse會自動為我們編譯此Java文件,后面要是用到。

第二步:

生成共享庫的頭文件:

進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/ 下:

可以看到里面后很多后綴為.class的文件,就是eclipse為我們自動編譯好了的java文件,其中就有:

HelloWorld.class文件。

退回到classes一級目錄:/HelloWorld/bin/classes/

執(zhí)行如下命令:

javah com.lucyfyr.HelloWorld

生成文件:com_lucyfyr_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class com_lucyfyr_HelloWorld */

#ifndef _Included_com_lucyfyr_HelloWorld

#define _Included_com_lucyfyr_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_lucyfyr_HelloWorld

* Method: printJNI

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

可以看到自動生成對應的函數(shù):Java_com_lucyfyr_HelloWorld_printJNI

Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 接口名(printJNI):必須要按此JNI規(guī)范來操作;

java虛擬機就可以在com.simon.HelloWorld類調(diào)用printJNI接口的時候自動找到這個C實現(xiàn)的Native函數(shù)調(diào)用。

當然函數(shù)名太長,可以在.c文件中通過函數(shù)名映射表來實現(xiàn)簡化。

第三步:

實現(xiàn)JNI原生函數(shù)源文件:

新建com_lucyfyr_HelloWorld.c文件:

android 為什么要使用jni

android的jni可以使用c/c++來開發(fā),相比java而言,運行的效率提高了很多,特別是在做一些圖像算法,或者游戲邏輯的時候,使用jni將大大的提高效率。比如某個游戲要采用opengl,同樣加載一個由1000個多邊形組成的3d模型,jni要比java運算快好幾倍,這樣就保證了游戲運行的fps不會太低。

另外一個好處就是內(nèi)存管理上面,java的內(nèi)存管理全部由虛擬機來管理,C++由程序員來管理,利用率上面就好多了。

等等其他優(yōu)點。

既然這么多的優(yōu)點,為什么一個android程序不采用純c來開發(fā)呢?因為是android的 UI framework采用java,所以,在UI上面還是采用java來開發(fā)。

Android JNI和NDK有什么區(qū)別

JNI是Java Native Interface的縮寫,中文為JAVA本地調(diào)用。從Java1.1開始,Java Native Interface(JNI)標準成為java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它并不妨礙你使用其他語言,只要調(diào)用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬件、操作系統(tǒng)進行交互,或者為了提高程序的性能。JNI標準至少保證本地代碼能工作在任何Java 虛擬機實現(xiàn)下。 標準的java類庫可能不支持你的程序所需的特性。 JNI·或許你已經(jīng)有了一個用其他語言寫成的庫或程序,而你希望在java程序中使用它。你可能需要用底層語言實現(xiàn)一個小型的時間敏感代碼,比如匯編,然后在你的java程序中調(diào)用這些功能。 NDK是Google公司推出的幫助Android開發(fā)者通過C/C++本地語言編寫應用的開發(fā)包,包含了C/C++的頭文件、庫文件、說明文檔和示例代碼,我們可以理解為Windows Platform SDK一樣,是純C/C++編寫的,但是Android并不支持純C/C++編寫的應用,同時NDK提供的庫和函數(shù)功能很有限,僅僅處理些算法效率敏感的問題,所以推薦初學者學好Java后再學習JNI。 NDK集成了交叉編譯器,并提供了相應的mk文件隔離CPU、平臺、ABI等差異,開發(fā)人員只需要簡單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。 NDK可以自動地將so和Java應用一起打包,極大地減輕了開發(fā)人員的打包工作。

網(wǎng)站標題:android與jni,什么是android
分享地址:http://chinadenli.net/article36/dsgeopg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航品牌網(wǎng)站建設網(wǎng)站維護靜態(tài)網(wǎng)站域名注冊關鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站