首页 Android-JNI实现方式及实例演示_有米分享

Android-JNI实现方式及实例演示_有米分享

举报
开通vip

Android-JNI实现方式及实例演示_有米分享Android-JNI实现方式及实例演示 试 阅 …….回到 android 顶层目录。执行: coconut@ubuntu:~/android$ make SimpleJNI ============================================ PLATFORM_VERSION_CODENAME=AOSP PLATFORM_VERSION=AOSP TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_...

Android-JNI实现方式及实例演示_有米分享
Android-JNI实现方式及实例演示 试 阅 …….回到 android 顶层目录。执行: coconut@ubuntu:~/android$ make SimpleJNI ============================================ PLATFORM_VERSION_CODENAME=AOSP PLATFORM_VERSION=AOSP TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=MASTER ============================================ /bin/bash: line 0: cd: development/tools/layoutopt/app/src/resources: No such file or directory Notice file: external/elfcopy/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libelfcopy.a.txt target Prelink: libdl (out/target/product/generic/symbols/system/lib/libdl.so) target Strip: libdl (out/target/product/generic/obj/lib/libdl.so) target SharedLib: libc (out/target/product/generic/obj/SHARED_LIBRARIES/libc_intermediates/LINKED/libc.so) target Prelink: libc (out/target/product/generic/symbols/system/lib/libc.so) libelfcopy: Warning: DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8 libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! libelfcopy: Warning: Range lists in .debug_ranges section start at 0x40 target Strip: libc (out/target/product/generic/obj/lib/libc.so)…… 正 文: 主要内容: 一、JNI的多重实现方式 二、Android-JNI 编译实例教程 三、实现一个非常简单的JNI的实例程序 一、JNI的多重实现方式 1 应用级 用eclipse构建一个应用程序,JNITest1。 Xml代码 1​ < ?xml version="1.0" encoding="utf-8"?> 2​ < LinearLayout xmlns:android= 3​ "http://schemas.Android.com/apk/res/Android" 4​ Android:orientation="vertical" 5​ Android:layout_width="fill_parent" 6​ Android:layout_height="fill_parent" 7​ > 8​ < TextView 9​ Android:id="@+id/JNITest" 10​ Android:layout_width="fill_parent" 11​ Android:layout_height="wrap_content" 12​ Android:text="@string/JNITest" 13​ /> 14​ < /LinearLayout> JAVA代码: package com.jni.test; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class JNITest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String str=GetTest(); TextView tv=(TextView)findViewById(R.id.JNITest); tv.setText(str); } static{ System.loadLibrary("JNITest1");//libJNITest1.so } public native String GetTest(); } 在java文件生成class文件后,进入工程根目录,使用如下命令: javah -classpath bin -d jni com.jni.test.JNITest 会在根目录下生成jni目录: com_jni_test_JNITest.h如下: /* DO NOT EDIT THIS FILE - it is machine generated */ #include #ifndef __com_jni_test_JNITest__ #define __com_jni_test_JNITest__ #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_com_jni_test_JNITest_GetTest (JNIEnv *env, jobject); #ifdef __cplusplus } #endif #endif /* __com_jni_test_JNITest__ */ 在external目录下,建立目录TestJNI/libJNITest1,将com_jni_test_JNITest.h复制到该目录下,建立a.c如下: #include "com_jni_test_JNITest.h" #define LOG_TAG "JNITest" #undef LOG #include JNIEXPORT jstring JNICALL Java_com_jni_test_JNITest_GetTest (JNIEnv *env, jobject fggg)//一定要补上 { return (*env)->NewStringUTF(env,(char *)"JNITest1 native String"); LOGD("Hello LIB!\n"); } 编写Android.mk文件,内容如下: LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:=a.c LOCAL_C_INCLUDES:=$(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES:=libutils LOCAL_PRELINK_MODULE:=false LOCAL_MODULE:=libJNITest1 include $(BUILD_SHARED_LIBRARY) 执行命令模式如下: cd cd mydroid/build/ envsetup.sh cd ~/mydroid cd external/libJNITest/ mm mm输出: make: Entering directory `/home/smrdn/Android/android-1.6_r2' target thumb C: libJNITest1 <= /home/smrdn/Android/android-1.6_r2/external/TestJni/libJNITest1/a.c target SharedLib: libJNITest1 (out/target/product/generic/obj/SHARED_LIBRARIES/libJNITest1_intermediates/LINKED/libJNITest1.so) target Non-prelinked: libJNITest1 (out/target/product/generic/symbols/system/lib/libJNITest1.so) target Strip: libJNITest1 (out/target/product/generic/obj/lib/libJNITest1.so) Install: out/target/product/generic/system/lib/libJNITest1.so make: Leaving directory `/home/smrdn/Android/android-1.6_r2' 实验证明只要是在external中的目录下的jni都会出现如上情况,在不同的目录下生成目标模块。 Android Jni使用 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 步骤(8)在模拟器中执行程序 首先要把动态库拷进/system/lib中。 启动模拟器 adb shell adb remount adb push libJNITest.so /system/lib 确认拷贝成功。 cd /system/lib ls 然后不要关闭模拟器(关掉再开动态库就没了,因为模拟器rom是只读) 执行java程序JNITest 会看到屏幕上打印出 JNITest Native String 2 在framework中的JNI 第一步: 编写java类,其并不完整,有部分方法需要用到C++,先建立java,在回到底层的C++部分 在文件android-1.6_r2下:frameworks/base/core/java/下建立自己的Java类。 例如建立android/myTest/helloJNI.java,代码如下: package android.myTest; public class helloJNI{ public helloJNI(){ System.out.println("Test helloJNI: "+getString()); } public native String getString(); } 其中getString是用C++编写的部分。 第二步:编写自己的C++函数体: frameworks/base/core/jni/ android_myTest_helloJNI.cpp,注意文件名是java类的包名和类名的结合。代码如下: #define LOG_TAG "DebugJNI" #include "jni.h" #include "nativehelper/JNIHelp.h" #include "utils/Log.h" #include "utils/misc.h" //#include "android_runtime/AndroidRuntime.h" namespace android { /* * Implements: * native int part1(int intArg, double doubleArg, String stringArg, * int[] arrayArg) */ //jstring 是jni与java中string相对应,可以看出函数名的前面部分是包名和类名,最后面就是Java中定义的方法, //参数:JNIEnv* env, jobject object是必须的,如果有别的参数,在添加到后面 static jstring android_myTest_helloJNI_getString(JNIEnv* env, jobject object) { LOGI("helloJNI\thelloJNI\thelloJNI"); return env->NewStringUTF("Hello JNI"); } //参考下面就好, JNINativeMethod后面有详解 static JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "getString", "()Ljava/lang/String;", (void*) android_myTest_helloJNI_getString} }; //注册 int register_android_myTest_helloJNI(JNIEnv* env) { return jniRegisterNativeMethods(env, "android/myTest/helloJNI", gMethods, NELEM(gMethods)); } #if 0 /* trampoline into C++ */ extern "C" int register_android_debug_JNITest_C(JNIEnv* env) { return android::register_android_debug_JNITest(env); } #endif }; // namespace android 此时并没有完,需要在当前目录下找到Android.mk,这是编译jni的文件,只有加进去才能编译自己建立的cpp文件: 在LOCAL_SRC_FILES:= \下添加如下一行android_myTest_helloJNI.cpp\ 在当前目录下找到AndroidRuntime.cpp下添加一些东西: static const RegJNIRec gRegJNI[]数组下添加REG_JNI(register_android_myTest_helloJNI), 添加extern int register_android_myTest_helloJNI (JNIEnv* env);进行注册。 在android-1.6_r2下执行make或者make framework 在此时,我们建立的类就可以作为系统的API用了,例如:android.myTest.helloJNI hellojni=new ……………… 第三步:在外面有eclips建立一个helloJNITest工程,放在package/apps/目录下, 并直流系src目录和res目录,其余目录删掉,在该目录下建立Android.mk文件,如下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := user LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := HelloJNITest include $(BUILD_PACKAGE) 建立java文件类HelloJNITest: package com.android.helloJNI; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.myTest.helloJNI; public class HelloJNITest extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); helloJNI hj=new helloJNI(); String s=hj.getString(); TextView tv=(TextView) this.findViewById(R.id.tv); tv.setText(s); android.util.Log.d("ddddd","-------------"+s); } } 3 Android JNI 使用的数据结构JNINativeMethod详解 Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下: typedef struct { const char* name; const char* signature; void* fnPtr; } JNINativeMethod; 第一个变量name是Java中函数的名字。 第二个变量signature,用字符串是描述了函数的参数和返回值 第三个变量fnPtr是函数指针,指向C函数。 其中比较难以理解的是第二个参数,例如 "()V" "(II)V" "(Ljava/lang/String;Ljava/lang/String;)V" 实际上这些字符是与函数的参数类型一一对应的。 "()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func(); "(II)V" 表示 void Func(int, int); 具体的每一个字符的对应关系如下 字符 Java类型 C类型 V void void Z jboolean boolean I jint int J jlong long D jdouble double F jfloat float B jbyte byte C jchar char S jshort short 数组则以"["开始,用两个字符表示 [I jintArray int[] [F jfloatArray float[] [B jbyteArray byte[] [C jcharArray char[] [S jshortArray short[] [D jdoubleArray double[] [J jlongArray long[] [Z jbooleanArray boolean[] 上面的都是基本类型。如果Java函数的参数是class,则以"L"开头,以";"结尾中间是用"/" 隔开的包及类名。而其对应的C函数名的参数则为jobject. 一个例外是String类,其对应的类为jstring Ljava/lang/String; String jstring Ljava/net/Socket; Socket jobject 如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。 例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z" 4 development下的jni 1. 首先编写C模块,实现动态库。 在development目录下添加新目录hellolib,并添加hellolib.c和Android.mk文件。hellolib.c的内容如下: #include #define LOG_TAG "TestLib" #undef LOG #include JNIEXPORT void JNICALL Java_com_test_TestHelloLib_printHello(JNIEnv * env, jobject jobj) { LOGD("Hello LIB!\n"); } 注意这里的函数名需要按照JNI的规范(因此也可以用javah -jni工具来生成头文件,来保证函数名的正确性),Java_com_test_TestHelloLib_printHello的命名对应后面在java代码中,package名字是com.test,类名是TestHelloLib,native函数名是printHello。 另外,LOGD及#define LOG_TAG "TestLib"等打印log的方式是采用了Android所提供的LOG机制,这样才能通过Android的logcat工具看到log。 用于编译C模块的Android.mk文件内容如下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ hellolib.c LOCAL_C_INCLUDES := \ $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := \ libutils LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libhello include $(BUILD_SHARED_LIBRARY) 该文件中的一些变量分别对应的含义如下: LOCAL_SRC_FILES- 编译的源文件 LOCAL_C_INCLUDES- 需要包含的头文件目录 LOCAL_SHARED_LIBRARIES- 链接时需要的外部库 LOCAL_PRELINK_MODULE- 是否需要prelink处理(参考prelink的详细介绍:《动态库优化——Prelink(预连接)技术》,Android的Toolchain, prelink工具:《Android Toolchain与Bionic Libc》) LOCAL_MODULE- 编译的目标对象 BUILD_SHARED_LIBRARY- 指明要编译成动态库。 接下来回到Android顶层目录,并执行make libhello来编译: # cd $(YOUR_ANDROID) && make libhello target thumb C: libhello <= development/hellolib/hellolib.c target SharedLib: libhello (out/target/product/generic/obj/SHARED_LIBRARIES/libhello_intermediates/LINKED/libhello.so) target Non-prelinked: libhello (out/target/product/generic/symbols/system/lib/libhello.so) target Strip: libhello (out/target/product/generic/obj/lib/libhello.so) Install: out/target/product/generic/system/lib/libhello.so 编译结果可得到位于out/target/product/generic/system/lib/目录的动态共享库libhello.so 2.编写Java模块,来通过JNI方式调用C接口。具体Eclipse环境的搭建请参考Android SDK文档中的详细说明,及Hello Android程序的创建过程,这里仅给出我们需要修改的TestHelloLib.java文件: package com.test; import android.app.Activity; import android.os.Bundle; public class TestHelloLibextends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); printHello(); } static { System.loadLibrary("hello"); } privatenativevoidprintHello(); } 注意上面代码中粗体字部分:private native void printHello()用来声明一个native接口,static { System.loadLibrary("hello"); }用来加载上面步骤中生成libhello.so(注意loadLibrary方法的参数不是”libhello.so”,而是去掉前缀和后缀之后的”hello”),onCreate()方法中则调用了printHello()接口。 通过这一步骤可生成Android开发者所熟悉的apk文件:TestHelloLib.apk。 3.集成测试TestHelloLib.apk和libhello.so。先运行emulator并将TestHelloLib.apk和libhello.so上传至emulator中。注意要将libhello.so上传到emulator的/system/lib目录,由于该目录是只读的,上传之前先要执行adb remount: # adb remount # adb push out/target/product/generic/system/lib/libhello.so /system/lib # adb install TestHelloLib.apk 接下来在模拟器菜单中可以看到已经安装的TestHelloLib程序,运行即可。 由于JNI接口printHello()并没有作界面上的改动,要验证其效果需要用Android的logcat工具来查看。运行”adb logcat”可以找到下面的log片断: I/ActivityManager( 48): Starting activity: Intent { action=android.intent.action.MAIN categories={android.intent.category.LAUNCHER} flags=0x10200000 comp={com.test/com.test.TestHelloLib} } I/ActivityManager( 48): Start proc com.test for activity com.test/.TestHelloLib: pid=174 uid=10024 gids={} D/dalvikvm( 174): Trying to load lib /system/lib/libhello.so 0x43481c58 D/dalvikvm( 174): Added shared lib /system/lib/libhello.so 0x43481c58 D/dalvikvm( 174): No JNI_OnLoad found in /system/lib/libhello.so 0x43481c58 D/dalvikvm( 174): +++ not scanning '/system/lib/libwebcore.so' for 'printHello' (wrong CL) D/dalvikvm( 174): +++ not scanning '/system/lib/libmedia_jni.so' for 'printHello' (wrong CL) D/TestLib ( 174): Hello LIB! I/ActivityManager( 48): Displayed activity com.test/.TestHelloLib: 806 ms 这里包含了调用printHello()接口的log信息,其中”D/TestLib ( 174): Hello LIB!”就是printHello()所打印的信息。至此成功完成Android JNI的实例验证。 二、Android-JNI 编译实例教程 问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 1: 如何来进行JNI的编程呢?过程是如何样呢? 所谓神马都是有解决方法的.小哈做如下解: 首先你肯定要有一个编译环境啦..亮出我们本次的主角:ubuntu 10 开始,是通过GIT 得到ANDROID源码, 有了源码我们能做什么?打广告?写程序打广告赚钱? NO.我们本次是要做JNI..学会了JNI,才能更好地写程序打广告赚钱..:D 童鞋们有什么好的建议及问题.就请联系.大家一起交流. 本文章使用的环境是: UBUNTU 10 + G1 好了,不罗嗦了,接下来就是漫长的等待...华丽地等待...等待着YY的到来.. 终于编译完成了... 看到在BUILD目录下有个 envsetup.sh ,执行它 看好了,使用: ~/build$ . envsetup.sh 把环境搭建好 之后实验在development/samples/SimpleJNI/ 目录下。执行: mm 好了.接下来的就是编译SimpleJNI项目的过程了..要看好..别走神了! coconut@ubuntu:~/android$ mm development/samples/SimpleJNI/ AndroidManifest.xml Android.mk jni/ src/ coconut@ubuntu:~/android$ mm development/samples/SimpleJNI/ ============================================ PLATFORM_VERSION_CODENAME=AOSP PLATFORM_VERSION=AOSP TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=MASTER ============================================ *** Build configuration changed: "generic-eng-sdk-{mdpi}" -> "generic-eng-{mdpi}" *** Forcing "make installclean"... *** Done with the cleaning, now starting the real build. diff: out/target/product/generic/obj/PACKAGING/updater_extensions_intermediates/register.inc.list: No such file or directory /bin/bash: line 0: cd: development/tools/layoutopt/app/src/resources: No such file or directory make: Nothing to be done for `development/samples/SimpleJNI/'. cat Android.mk // 这个格式是ANDROID的专用MAKEFILE文件。 //----接下来我们查看下mk文件 coconut@ubuntu:~/android/development/samples/SimpleJNI$ cat Android.mk |more # # Copyright (C) 2008 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This makefile shows how to build a shared library and an activity that # bundles the shared library and calls it using JNI. TOP_LOCAL_PATH:= $(call my-dir) # Build activity LOCAL_PATH:= $(TOP_LOCAL_PATH) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := samples LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := SimpleJNI //这个是就编译的包名!!! LOCAL_JNI_SHARED_LIBRARIES := libsimplejni include $(BUILD_PACKAGE) # ============================================================ # Also build all of the sub-targets under this one: the shared library. include $(call all-makefiles-under,$(LOCAL_PATH)) ///------ 然后 ,回到 android 顶层目录。执行: coconut@ubuntu:~/android$ make SimpleJNI ============================================ PLATFORM_VERSION_CODENAME=AOSP PLATFORM_VERSION=AOSP TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=MASTER ============================================ /bin/bash: line 0: cd: development/tools/layoutopt/app/src/resources: No such file or directory Notice file: external/elfcopy/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libelfcopy.a.txt target Prelink: libdl (out/target/product/generic/symbols/system/lib/libdl.so) target Strip: libdl (out/target/product/generic/obj/lib/libdl.so) target SharedLib: libc (out/target/product/generic/obj/SHARED_LIBRARIES/libc_intermediates/LINKED/libc.so) target Prelink: libc (out/target/product/generic/symbols/system/lib/libc.so) libelfcopy: Warning: DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8 libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! libelfcopy: Warning: Range lists in .debug_ranges section start at 0x40 target Strip: libc (out/target/product/generic/obj/lib/libc.so) target SharedLib: libstdc++ (out/target/product/generic/obj/SHARED_LIBRARIES/libstdc++_intermediates/LINKED/libstdc++.so) target Prelink: libstdc++ (out/target/product/generic/symbols/system/lib/libstdc++.so) target Strip: libstdc++ (out/target/product/generic/obj/lib/libstdc++.so) target SharedLib: libm (out/target/product/generic/obj/SHARED_LIBRARIES/libm_intermediates/LINKED/libm.so) target Prelink: libm (out/target/product/generic/symbols/system/lib/libm.so) libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! target Strip: libm (out/target/product/generic/obj/lib/libm.so) target SharedLib: liblog (out/target/product/generic/obj/SHARED_LIBRARIES/liblog_intermediates/LINKED/liblog.so) target Prelink: liblog (out/target/product/generic/symbols/system/lib/liblog.so) libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! target Strip: liblog (out/target/product/generic/obj/lib/liblog.so) target SharedLib: libz (out/target/product/generic/obj/SHARED_LIBRARIES/libz_intermediates/LINKED/libz.so) target Prelink: libz (out/target/product/generic/symbols/system/lib/libz.so) libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! target Strip: libz (out/target/product/generic/obj/lib/libz.so) target SharedLib: libcutils (out/target/product/generic/obj/SHARED_LIBRARIES/libcutils_intermediates/LINKED/libcutils.so) target Prelink: libcutils (out/target/product/generic/symbols/system/lib/libcutils.so) libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! target Strip: libcutils (out/target/product/generic/obj/lib/libcutils.so) target SharedLib: libutils (out/target/product/generic/obj/SHARED_LIBRARIES/libutils_intermediates/LINKED/libutils.so) target Prelink: libutils (out/target/product/generic/symbols/system/lib/libutils.so) libelfcopy: Warning: DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8 libelfcopy: Warning: DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8 libelfcopy: Warning: Location lists in .debug_info section aren't in ascending order! libelfcopy: Warning: Range lists in .debug_info section aren't in ascending order! libelfcopy: Warning: Range lists in .debug_ranges section start at 0x5b8 target Strip: libutils (out/target/product/generic/obj/lib/libutils.so) target SharedLib: libsimplejni (out/target/product/generic/obj/SHARED_LIBRARIES/libsimplejni_intermediates/LINKED/libsimplejni.so) target Non-prelinked: libsimplejni (out/target/product/generic/symbols/system/lib/libsimplejni.so) 【!!!!】 target Strip: libsimplejni (out/target/product/generic/obj/lib/libsimplejni.so) Notice file: frameworks/base/libs/utils/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libutils.a.txt Notice file: system/core/liblog/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/liblog.a.txt Notice file: system/core/libcutils/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libcutils.a.txt Notice file: external/expat/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libexpat.a.txt Notice file: external/libpng/NOTICE -- out/host/linux-x86/obj/NOTICE_FILES/src//lib/libpng.a.txt Copying: out/target/common/obj/APPS/SimpleJNI_intermediates/classes-full-debug.jar Copying: out/target/common/obj/APPS/SimpleJNI_intermediates/classes.jar target Dex: SimpleJNI target Package: SimpleJNI (out/target/product/generic/obj/APPS/SimpleJNI_intermediates/package.apk) 【!!!!】 adding: lib/ (stored 0%) adding: lib/armeabi/ (stored 0%) adding: lib/armeabi/libsimplejni.so (deflated 76%) 'out/target/common/obj/APPS/SimpleJNI_intermediates/classes.dex' as 'classes.dex'... Install: out/target/product/generic/system/app/SimpleJNI.apk //---- 完成! //参考: http://www.adthree.cn //完成后怎么玩? [Run] 01. First get the two file - libsimplejni.so and simplejni.apk 上面标!!!的地方 02. Start adb 03. #adb push libsimplejni.so /system/lib (Put the library into your device/emulator) 04. #adb install simplejni.apk (install your application) 05. WOW, amazing! 三、实现一个非常简单的JNI的实例程序 Android的SDK中没有包括JNI的支持,而且对如何支持JNI也没有任何文档说明。不过既然整个Android平台是开源的,我们可以通过Google发布的源代码来找到一些线索(比如framewo
本文档为【Android-JNI实现方式及实例演示_有米分享】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_491028
暂无简介~
格式:doc
大小:172KB
软件:Word
页数:25
分类:互联网
上传时间:2011-09-03
浏览量:21