很多网友对Android JNI和C++开发相关的技术很感兴趣,由于JNI大部分技术都是针对Windows PC的,对于Android的JNI学习除了SDK中的一些例子外,其实大家完全可以通过Android源码中的base.git中根目录下的/core/jni文件夹下的cpp和h文件进行学习,这里是Google Android开发团队进行编码,在代码质量和稳定性方面都有保障,这里Android123推荐大家通过这些代码了解底层相关实现细节,虽然是C++的代码不过编码风格还是C的实现,对于基础学习,Android开发来说,开源方面的优势大幅超越封闭的iPhone和Windows Phone,同时对于间接使用Android Dalvik的Ophone OS 3、WebOS来说还是相当好的,当然有兴趣的网友可以移植Dalvik到Meego。
JNI
Android JNI实例代码(一) Android开发技术
前几天Android123有关Android JNI开发系列教程中有关的源代码,可以在本文中查找: 一、 在JNI中执行Java方法 class AndroidJniDemo { private native void executeMethod(); private void show() { System.out.println("Java cwj print"); //执行了show方法后打印java层的输出 } public static void main(String args[]) { //这里我们在J2SE中测试,Android开发者可以放到Activity中的onCreate调用 AndroidJniDemo ajd = new AndroidJniDemo(); ajd.executeMethod(); } static { System.loadLibrary("AndroidJniDemo"); }} 下面是JNI代码: JNIEXPORT void JNICALLJava_AndroidJniDemo_executeMethod(JNIEnv *env, jobject obj){ jclass clazz = (*env)->GetObjectClass(env, obj); //通过类的对象 jmethodID mid = (*env)->GetMethodID(env, clazz, "show", "()V"); //查找java中的show方法的ID,最后的签名符号为void类型 if (mid == NULL) { return; //如果方法ID没有找到 } printf("JNI cwj print"); //从JNI中打印输出 […]
Android JNI实例代码(二) Android开发技术
我们继续Android JNI开发中的常用代码,第二部分将包含如何在JNI中构造实例化一个Java类以及异常处理的具体方法,有关前一部分的内容可以查看 Android JNI实例代码(一) 。 三、在JNI中构造和实例化Java类 public class AndroidJniDemo4{ public static native void constructClass(); //JNI方法 public static void main(String[] args){ AndroidJniDemo4.constructClass(); }} class CwjThread implements Runnable { int nCount = 0 ; public void run(){ try{ Thread.sleep(1987); //休眠1987毫秒 }catch(Exception e){ e.printStackTrace(); } System.out.println("Count="+ nCount); }} JNIEXPORT void JNICALLJava_AndroidJniDemo4_constructClass(JNIEnv *env, jclass clazz){ jclass jclazz , cwjclazz; jmethodID mid , mid2 , runmid ; jobject obj , obj2 ; jclazz = […]
Android NDK之JNI使用例子 Android开发技术
目前Android NDK只能编译出动态库.so文件,并不是能生成.apk文件,这里我们简单介绍下NDK中的Hello JNI列子。整个例子分Java和Native C两个部分。首先是我们常用的Java端调用部分。 package com.example.hellojni; import android.app.Activity;import android.widget.TextView;import android.os.Bundle; public class HelloJni extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); //如果调用失败将会抛出 java.lang.UnsatisfiedLinkError异常 setContentView(tv); } //注意下面的native关键字 public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello-jni"); //载入hello-jni库 } } 需要注意的是这里必须设置SDK版本为1.5或以上版本即在androidmanifest.xml文件中指明<uses-sdk […]
Android 1.0不会支持JNI,无缘C++ Android开发技术
Android 1.0最终的版本无法执行本地JNI调用,基本上C++无缘Android开发,这也符合Google给我提供一个Dalvik版的Java原因,虽然最终Android源代码会全部开源,但是整个系统平台会保证安全,从上一版本的SDK已经看到很多bin程序都移除了SQLite3的移除就是一个暗示,提供足够多的Dalvik API可以让我们了解到这些都是为平台安全准备,还有很多android permission和android签名保护机制就是一种间接的ACL保护,不用把时间耽误到这些方面,如果不开发一个类似Android的Linux操作系统,这些似乎不是我们关心的话题。
JNI调用Native C++的so动态库仍然可以 Android开发技术
目前Android 1.0上仍然可以调用本地的程序,我们发现telnetd、shell这样的程序就是通过JNI调用的Native C++原始的so动态库实现的功能。但是我们自己写的Native C程序在上面执行需要Root权限,上传到系统的System/bin下面也是需要权限的。似乎这些只有在G1的Home+Reject(菜单+挂机)键来实现进入工程模式,通过adb调试接口来替换文件的方式来解决。 考虑了许久这仍然需要漏洞去跳入Root权限用户,目前按照Google的策略是对于Android平台发现漏洞后就会执行强制的更新,最终通过Kill Switch服务器来自动结束恶意程序还是等于白费功夫。否则用户在不更新下会产生安全漏洞,经过特殊构造的攻击程序可以直接威胁Android手机的安全。Android开发网分析后发现JNI调用可以使用Linux系统中现成的命令,比如logcat,获取shell还是可行的。自己做Native应用除非不在Google官方的系统中使用,否则正常用户是不会用这么多步骤或冒风险去安装的,对于最终的部署存在很多问题。同时正常的Native通过res/raw方式部署到market可能会被Google移除。

