日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[转]Android JNI使用方法

發(fā)布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]Android JNI使用方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文轉(zhuǎn)自:http://www.open-open.com/lib/view/open1324909652374.html

?

經(jīng)過幾天的努力終于搞定了android JNI部分,下面將我的這個小程序和大家分享一下。android JNI是連接android Java部分和C/C++部分的紐帶,完整使用JNI需要Java代碼和C/C++代碼。其中C/C++代碼用于生成庫文件,Java代碼用于引用C /C++庫文件以及調(diào)用C/C++方法。

android Java部分代碼:

01jnitest.java
02??
03package com.hello.jnitest;
04??
05???
06??
07import android.app.Activity;
08??
09import android.os.Bundle;
10??
11???
12??
13public class jnitest extends Activity {
14??
15????/** Called when the activity is first created. */
16??
17????@Override
18??
19????public void onCreate(Bundle savedInstanceState) {
20??
21????????super.onCreate(savedInstanceState);
22??
23????????setContentView(R.layout.main);
24??
25????????Nadd test = new Nadd();
26??
27????????setTitle("The Native Add Result is "+String.valueOf(test.nadd(10, 20)));
28??
29????}?
30??
31}
32??
33Nadd.java
34??
35package com.hello.jnitest;
36??
37???
38??
39public class Nadd {
40??
41static {
42??
43System.loadLibrary("hello_jni");
44??
45}
46??
47???
48??
49public native int nadd(int a, int b);
50??
51}


Java代碼說明: 1)jnitest.java是一個activity的類對象,在該類對象中生成調(diào)用JNI函數(shù)的類對象,同時調(diào)用JNI方法,最后將JNI方法的結(jié)果顯示到標題欄上; 2)Nadd.java是一個引用和聲明JNI庫和函數(shù)的類,其中System.loadLibrary();函數(shù)用來引用JNI庫,默認JNI庫放在 android系統(tǒng)的/system/lib/目錄下;public nadd int nadd(int a, int b);為聲明需要在java程序中使用的JNI庫中的函數(shù); JNI中java部分的代碼到此就結(jié)束了,總結(jié)一下在java代碼中需要做兩件事: 1)使用System.loadLibrary()函數(shù)來引用JNI庫; 2)聲明調(diào)用JNI庫的函數(shù)且前面添加native關(guān)鍵字;
android C/C++部分代碼:
01#define LOG_TAG "hello-JNI"
02#include <stdio.h>
03#include <stdlib.h>
04#include <unistd.h>
05#include <sys/types.h>
06#include <sys/stat.h>
07#include <fcntl.h>
08#include <assert.h>
09#include "jni.h"
10#include "JNIHelp.h"
11#include "android_runtime/AndroidRuntime.h"
12static jint com_hello_jnitest_jnitest_nadd(JNIEnv *env, jobject obj, jint a, jint b)
13{
14return (a * b);
15}
16static JNINativeMethod gMethods[] = {
17{"nadd", "(II)I", (void *)com_hello_jnitest_jnitest_nadd},
18};
19static int register_android_test_hello(JNIEnv *env)
20{
21return android::AndroidRuntime::registerNativeMethods(env, "com/hello/jnitest/Nadd", gMethods, NELEM(gMethods));
22}
23jint JNI_OnLoad(JavaVM *vm, void *reserved)
24{
25JNIEnv *env = NULL;
26if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
27printf("Error GetEnv\n");
28return -1;
29}
30assert(env != NULL);
31if (register_android_test_hello(env) < 0) {
32printf("register_android_test_hello error.\n");
33return -1;
34}
35return JNI_VERSION_1_4;
36}


JNI C/C++代碼說明: 1)JNI_OnLoad()函數(shù)。該函數(shù)在Java程序調(diào)用System.loadLibrary()時,被調(diào)用執(zhí)行,用于向JavaVM注冊JNI函數(shù)等。在本例中首先通過參數(shù)JavaVM(Java虛擬機指針)獲取當前應(yīng)用程序所在的線程,即:JNIEnv。再通過調(diào)用 android::AndroidRuntime::registerNativeMethods()注冊native實現(xiàn)的函數(shù)指針。 2)JNI函數(shù)和Java調(diào)用函數(shù)的映射關(guān)系。使用JNINativeMethod將java調(diào)用的函數(shù)名與JNI實現(xiàn)的函數(shù)名聯(lián)系在一起; 3)JNI函數(shù)實現(xiàn);
Android.mk代碼:
1LOCAL_PATH := $(call my-dir)
2include $(CLEAR_VARS)
3LOCAL_PRELINK_MODULE := false
4LOCAL_SRC_FILES := \
5com_hello_jnitest.cpp
6LOCAL_SHARED_LIBRARIES := \
7libandroid_runtime
8LOCAL_MODULE := libhello_jni
9include $(BUILD_SHARED_LIBRARY)

需要注意的是: 1)JNI C/C++部分的代碼需要在android源代碼樹上進行編譯,編譯完成后我的做法是直接將生成的.so通過adb push方法上傳到android虛擬機的/system/lib/目錄下; 2)java代碼可以在eclipse下直接編譯且在虛擬機上執(zhí)行;
編譯JNI C/C++部分代碼(在android內(nèi)核源代碼根目錄下): #make libhello_jni 之后在out/target/product/generic/system/lib/目錄下生成libhello_jni.so
上傳libhello_jni.so到android虛擬機: #adb push out/target/product/generic/system/lib/libhello_jni.so /system/lib 注意:此時有可能出現(xiàn)Out of Memory的錯誤提示。當出現(xiàn)如上錯誤提示時,需要使用#adb remount重新加載一下就可以了。 另外,也有可能直接使用eclipse啟動android虛擬機時出現(xiàn)上述錯誤且使用#adb remount也出現(xiàn)的情況,此時需要手動啟動android虛擬機,如:#emulator -avd xxx -partition-size 128,之后在使用#adb push就可以了。

?

轉(zhuǎn)載于:https://www.cnblogs.com/freeliver54/archive/2012/02/03/2336621.html

總結(jié)

以上是生活随笔為你收集整理的[转]Android JNI使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。