`
globaldev
  • 浏览: 35269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个打通jni,java framework,application三层的练习

阅读更多
练习:从jni层获得一个字符串,在屏幕上显示,当然是手机屏幕
要求:
1.需要包含三层结构:JNI, java framework, java application
2.字符串的内容为“Hello from JNI !”,必须在JNI层定义

这个练习是在Android的源码工程下做的,我的Android源代码路径为/Android/android-1.6_r2

开工:

1.  JNI层 :在 /Android/android-1.6_r2/frameworks/base/core/jni 路径下创建例子 android_mytest_hellojni.cpp 文件,这个文件就是在 JNI 层实现接口。文件内容如下:(可参考同一目录下的 android_debug_JNITest.cpp 文件编写)

Cpp代码
#define LOG_TAG "HelloJNI" 
#include "jni.h" 
#include "nativehelper/JNIHelp.h" 
#include "utils/Log.h" 
#include "utils/misc.h" 
 
namespace android { 
static jstring android_mytest_hellojni_displayString(JNIEnv *env, jclass clazz) 

return env->NewStringUTF("Hello from JNI!"); 
}  
 
 
/*
* JNI registration.
*/ 
static JNINativeMethod gMethods[] = { 
    /* name, signature, funcPtr */ 
    { "displayString",      "()Ljava/lang/String;", 
            (void*) android_mytest_hellojni_displayString }, 
     
}; 
int register_android_mytest_hellojni(JNIEnv* env) 
{ //此处的目录结构就是在Javaframework层的文件目录,且必须一致 
return jniRegisterNativeMethods(env, "android/mytest/hellojni",      
        gMethods, NELEM(gMethods)); 

}; 


2. JNI 层:对编译的修改配置
  2.1修改/Android/android-1.6_r2/frameworks/base/core/jni目录下的Android.mk 文件,在LOCAL_SRC_FILES:= \ 下面加上
android_mytest_hellojni.cpp \
   2.2修改/Android/android-1.6_r2/frameworks/base/core/jni目录下的AndroidRuntime.cpp 文件在extern int 后面添加
extern int register_android_mytest_hellojni(JNIEnv* env);
然后在static const RegJNIRec gRegJNI[] = {下面添加
REG_JNI(register_android_mytest_hellojni),
这样,JNI层的修改就到此为止了。

3.   Javaframework 层:在 /Android/android-1.6_r2/frameworks/base/core/java/android/ 新建文件目录 mytest ,在该目录下新建文件 hellojni.java 声明接口。内容如下:(可以参考 android-1.6_r2/frameworks/base/core/java/android/debug 目录下的 JNITest.java 文件编写)

Java代码
package android.mytest; 
public class hellojni{ 
    public hellojni(){} 
//此处声明为public所以才可以被application调用 
    public static native String displayString();  


4 .下面我们要对我们做过更改的 libandroid_runtime.so 和 framework.jar 进行重新编译。
在源代码工程目录下输入 make libandroid_runtime 重新编译生成 libandroid_runtime.so

target thumb C++: libandroid_runtime <= frameworks/base/core/jni/android_mytest_hellojni.cpp
target thumb C++: libandroid_runtime <= frameworks/base/core/jni/AndroidRuntime.cpp
target SharedLib: libandroid_runtime (out/target/product/generic/obj/SHARED_LIBRARIES/libandroid_runtime_intermediates/LINKED/libandroid_runtime.so)
target Prelink: libandroid_runtime (out/target/product/generic/symbols/system/lib/libandroid_runtime.so)
target Strip: libandroid_runtime (out/target/product/generic/obj/lib/libandroid_runtime.so)
Install: out/target/product/generic/system/lib/libandroid_runtime.so
然后再输入 make framework 重新编译生成 framework.jar

Install: out/target/product/generic/system/framework/framework.jar



5.   然后在 eclipse 里面或者在记事本等编辑器(这么说只是为了说明只需要源代码),新建 Android project ,例子的结构如下:




在 testApp.java 文件中的内容如下:
Java代码
package com.integration.test; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
//需要import自己定义的包,包名可以根据文件目录结构得到 
 
import android.mytest.hellojni;      
public class testAPP 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); 
        hellojni hello = new hellojni();    //调用自己写的JNI 
        tv.setText(hello.displayString()+""); 
    } 


然后将上述文件复制到 /Android/android1.6_r2/packages/apps ,然后看教程《在源码中编译自己的 Android project 》就可以在模拟器中看到该应用运行如下图

分享到:
评论

相关推荐

    JNI(Java Native Interface)中文手册

    - **兼容性**:由于JNI是一个标准接口,因此一旦实现了某个本地库与Java之间的交互,这一实现通常可以在不同的Java平台上复用。 #### 四、JNI的组成部分 根据文档描述,本书主要分为以下几个部分: - **第二章**...

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    java jni 传递结构体

    文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据

    JNI创建java对象

    首先,要使用JNI创建Java对象,你需要定义一个Java类并添加本地方法声明。例如: ```java public class MyJavaObject { static { System.loadLibrary("mynative"); // 加载本地库 } public native void ...

    Java再说JNI之实例

    Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层...

    delphi通过JNI调用JAVA函数

    当我们需要在Delphi项目中利用Java的功能时,JNI(Java Native Interface)成为了一座桥梁,使得两者能够相互调用。本篇将深入探讨如何在Delphi中通过JNI来调用Java函数。 首先,我们需要理解JNI的概念。JNI是Java...

    一个简单的JNI实验

    这个"一个简单的JNI实验"是一个实践教程,旨在帮助初学者理解如何在Java程序中调用本地(非Java)代码,比如C或C++。下面我们将详细探讨JNI的相关知识点。 1. **JNI的基本概念**: JNI是Java平台提供的一种机制,...

    java jni简单实例

    本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...

    jni java传递对象到C

    在Java编程中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C和C++)进行交互。当我们需要高效地处理数据、利用特定平台的库或者优化性能时,JNI就显得尤为重要。本文将深入探讨...

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    androidjni编程,java和c层的互相通信传递数据

    Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...

    Android C、Java、JNI效率测试结果.doc

    Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C 调 Java、Java 调 C)基本运算、方法调用...

    Android JNI native调用 java层demo TESTJNI.zip

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI在许多场景下非常有用,例如优化性能、利用硬件特性、接入第三方库等。本文将深入...

    Delphi10.3 中通过JNI调用 Java 函数

    JNI是Java平台的一部分,它为Java代码与其他语言编写的代码提供了一个标准接口。通过JNI,开发者可以在Java应用程序中调用C、C++甚至是其他语言编写的原生代码,反之亦然。在Delphi中调用Java函数,可以利用JNI提供...

    jni4net C# java 相互调用

    这个库基于JNI(Java Native Interface),是Java平台上的一个标准机制,用于在Java代码和本地(非Java)代码之间建立桥梁。而jni4net则为.NET Framework提供了这样的桥接,使得C#应用程序能够无缝地与Java应用进行...

    visual studio 2019下C++通过JNI调用JAVA代码

    JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用与C/C++库无缝结合。 首先,我们需要确保已经安装了以下组件: 1. Visual Studio 2019:这是我们的开发环境,支持...

    jni回调Java层函数示例

    NI是Java Native Interface的缩写,是Java平台的重要特性,使得Java代码可以方便地与C/C++代码...本文主要给出一份示例代码(工程文件见附件),描述如何在Android的JNI层开启一个线程,并在线程中回调Java层的函数。

    jni java delphi调用

    Java和Delphi之间的交互主要通过Java Native Interface (JNI) 实现,这是一种允许Java代码调用本地(非Java)代码的框架。JNI在跨平台应用程序开发中扮演着重要角色,特别是当需要利用特定平台的库或者优化性能时。...

    Qt for Android 用JNI来使C++和Java互调(目前最新版全网只有这个可用)

    JNI是Java平台的一部分,它允许Java代码调用本地(非Java)代码,反之亦然。在Qt for Android中,我们可以通过JNI来调用C++编写的Qt函数,或者在C++代码中调用Android的API,实现对设备硬件和特定平台功能的访问。 ...

    如何利用JNI实现Java插件开发

    JNI在Java与本地代码之间提供了一个桥梁,使得Java可以调用本地库中的函数,同时也允许本地代码实例化Java对象并调用其方法。 #### 二、背景与目标 本文的主要目标是通过JNI技术来实现在Java应用程序中调用已有的...

Global site tag (gtag.js) - Google Analytics