实现apk 调用framework java JNI中方法
首先整个实现需要有Android源码编译环境。这里我用的是froyo2.2.
1.JNI层--C++代码部分
在目录frameworks/base/core/jni 下创建android_jnidemo_Hello.cpp(文件名称对应后面java实现的包名)代码内容可参考 android_debug_JNITest.cpp。注:如果把函数声明单独放到.h文件中,Hello.h可放到base/include /android_runtime目录或者自己创建的目录base/include/...../ 在.cpp文件中引入#include "android_runtime/Hello.h"

#define LOG_TAG "Demo Jni"
#include "jni.h"
#include "nativehelper/JNIHelp.h"
#include "utils/Log.h"
#include "utils/misc.h" namespace android {//android 命名空间 /*
*return string to app
*/
static jstring android_jnidemo_Hello_getString(JNIEnv *env, jclass clazz)
{
ALOGI("jni return a string!");
return env->NewStringUTF("Hello framework JNI!");//创建返回一个字符串
} /**
*registtration
*/
static JNINativeMethod gMethods[] = {
{"getString", "()Ljava/lang/String;", (void *) android_jnidemo_Hello_geString},
}; int register_android_jnidemo_Hello(JNIEnv* env)
{
return jniRegisterNativeMethods(env, "android/jnidemo/Hello", gMethods, NELEM(gMethods));
}
}

1.1 执行编译处理实现
修改android_jnidemo_Hello.cpp同目录的Android.mk文件。变量LOCAL_SRC_FILES:= \后加入android_jnidemo_Hello \
修改同目录下的AndroidRuntime.cpp 文件在extern int 后面添加
extern int register_android_jnidemo_Hello(JNIEnv* env);
然后在static const RegJNIRec gRegJNI[] = {
添加
REG_JNI(register_android_jnidemo_Hello),这样整个JNI 部分就完成了。
2.添加Java 代码
frameworks/base/core/java/android/jnidemo 自己创建目录jnidemo,java 类Hello.java

package android.jnidemo;//包名对应.cpp文件
public class Hello {
public Hello() {}
//app will call this native method
public static native String getString();
}

这里的java类中并不需要想,app java结合NDK实现JNI使用那样需加入
static {
System.loadLibrary("xxx");//动态库
}
应该是上面添加到AndroidRuntime 动态库,使虚拟机启动后就载入了。
3.创建一个apk项目Android project Hello

package com.integration.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.jnidemo.Hello; //import自己定义的包 public class HelloActivity extends Activity {
/** Called when the activity is first created. */
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView)findViewById(R.id.tv);
Hello hello = new Hello(); //创建自己写的framework java 对象 tv.setText(hello.getString());//调用native method
}
}

3.1保留Hello项目下res/ src/ AndroidManifest.xml 文件,并拷贝项目到源码目录package/apps/下,在项目根目录下添加Android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) #HelloJNI project name
LOCAL_PACKAGE_NAME := HelloJNI include $(BUILD_PACKAGE)

4.将Hello项目加入到系统编译中
在build/target/product/generic.mk文件 变量PRODUCT_PACKAGES := \后面加上HelloJNI \(对应Android.mk文件的LOCAL_PACKAGE_NAME
值)
5.编译
5.1切换到源码根目录下执行. build/envsetup.sh 初始化编译环境(若在此之前没执行过编译命令)
在执行lunch 1 选择编译的产品-----这里我的是默认编译generic
5.2编译前面添加的JNI代码,Android 的编译都是以模块位单位的,Android_Runtime是一个独立模块。
执行命令mm Android_Runtime 重新生成libandroid_runtime.so库,看到Install: out/target/product/generic/system/lib/libandroid_runtime.so结果
编译framework java部分,执行 mm framework
重新编译生成 framework.jar
Install: out/target/product/generic/system/framework/framework.jar
5.3编译Hello apk项目
执行命令mmm package/apps/Hello或者mm HelloJNI 生成HelloJNI.apk out/target/product/generic/system/app目录下
6.重新生成system.img文件
执行命令 make snod 得到新的 out/target/product/generic/system.img
7.启动emulator 打开HelloJNI apk查看结果(不截图了)
执行命令emulator& (前提在PATH环境变量中加入system.img ..... 镜像路径和emulator可执行文件路径
/usr/froyo/out/host/linux-x86/bin:/usr/froyo/out/target/product/generic)
也可以
emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
实现apk 调用framework java JNI中方法的更多相关文章
- JAVA JNI 中解决在C/C++跨线程FindClass失败
在JAVA与C/C++交互时使用JNI接口: 先是在JAVA调用的C++方法中直接测试FindClass,使用获取到的jclass操作没有任何问题: 但是在调用的C++方法中起线程后,在线程中Find ...
- C#实现调用Java类中方法
基本思路: 用C#实现调用Java编写的类中的方法:重点是将Java编写的程序打包成Jar,然后使用开源工具IKVM将其转化成DLL控件,在.NET环境下调用. 分为以下步骤: 1.下载JDK6(注: ...
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...
- JAVA 类中方法参数与返回值
无参无返回值的方法,用public void 方法名,来声明: 有参无返回值的方法,用public void 方法名,来声明: 有参有返回值的方法,用public int 方法名(int i,int ...
- java Date中方法toLocaleString过时的替代方案
DateFormat ddf = DateFormat.getDateInstance(); DateFormat dtf = DateFormat.getTimeInstance(); DateFo ...
- Android JNI中C和JAVA代码之间的互相调用
关于Android studio中使用NDK/JNI环境和入门:http://blog.csdn.net/quan648997767/article/details/64923143 1. C代码回调 ...
- Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...
- 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码
详解C#泛型(二) 一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...
- Java应用中使用ShutdownHook友好地清理现场、退出JVM的2种方法
Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jv ...
随机推荐
- Tiny64140之初始化时钟
简介: Tiny6410 时钟逻辑为整个芯片提供了3种时钟分别为FCLK.HCLK.PCLK有三个PLL 分别为APLL.MPLL.EPLL. APLL 专用于CPU MPLL 供AHB(存储 ...
- iOS 最新App提交上架流程及部分问题的解决方案2016.12.21,感谢原博主!!!
内容摘自http://www.cocoachina.com/bbs/3g/read.php?tid=330302,原博特别详细,下面我对部分地方进行了修改,主要是对在打包验证和上传的时候遇到的问题进行 ...
- Python笔记5(字符串)-20160921
一.字符串常用方法 1.title():返回字符串的标题版本,即单词首字母大写其余字母小写 2.upper():返回字符串全部大写版本,lower()则返回字符串全部小写版本 >>> ...
- java 学习心得
- 寒假学干货之------android开发环境
1.下载安装jdk(http://www.oracle.com/technetwork/java/javase/downloads/index.html)装se版的就可以了,复制jdk目录路径,之后配 ...
- Ubuntu14.04安装完全分布式Hadoop1.2.1
一直想装hadoop集群,但总是没有时间,最近抽了三天时间下定决定装了一下,在我的wmware上虚拟了一台Ubuntu14.04,然后再复制了两台虚拟机,准备开始!!!! 基本参考 http://ww ...
- 成都IT公司面经及公司评价
从2015年年底到2016年初找了几个月工作,面了大大小小若干公司,有很不错的公司,也有很多坑公司,与君共勉. 1.科大讯飞 地址:成都分公司位于天府软件园E区,占一层楼.面积挺大.公司装修风格很舒服 ...
- rxJava rxandroid 学习
学习地址 很全面: http://blog.csdn.net/meegomeego/article/details/49155989 final String[] words = {"Hel ...
- Struts2-2.了解struts.xml>package>action>result的name属性
result决定跳转到哪个视图(jsp),可以预设值有多个. <?xml version="1.0" encoding="UTF-8" ?> < ...
- 1、IO输入&输出流 简介
IO流的分类: * 流向: * 输入流 读取数据 * 输出流 写出数据 * 数据类型: * 字节流 * 字节输入流 读取数据 InputStream * 字节输出流 写出数据 OutputStream ...