练习:从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之间的交互,这一实现通常可以在不同的Java平台上复用。 #### 四、JNI的组成部分 根据文档描述,本书主要分为以下几个部分: - **第二章**...
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据
首先,要使用JNI创建Java对象,你需要定义一个Java类并添加本地方法声明。例如: ```java public class MyJavaObject { static { System.loadLibrary("mynative"); // 加载本地库 } public native void ...
Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层...
当我们需要在Delphi项目中利用Java的功能时,JNI(Java Native Interface)成为了一座桥梁,使得两者能够相互调用。本篇将深入探讨如何在Delphi中通过JNI来调用Java函数。 首先,我们需要理解JNI的概念。JNI是Java...
这个"一个简单的JNI实验"是一个实践教程,旨在帮助初学者理解如何在Java程序中调用本地(非Java)代码,比如C或C++。下面我们将详细探讨JNI的相关知识点。 1. **JNI的基本概念**: JNI是Java平台提供的一种机制,...
本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...
在Java编程中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C和C++)进行交互。当我们需要高效地处理数据、利用特定平台的库或者优化性能时,JNI就显得尤为重要。本文将深入探讨...
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...
Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C 调 Java、Java 调 C)基本运算、方法调用...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI在许多场景下非常有用,例如优化性能、利用硬件特性、接入第三方库等。本文将深入...
JNI是Java平台的一部分,它为Java代码与其他语言编写的代码提供了一个标准接口。通过JNI,开发者可以在Java应用程序中调用C、C++甚至是其他语言编写的原生代码,反之亦然。在Delphi中调用Java函数,可以利用JNI提供...
这个库基于JNI(Java Native Interface),是Java平台上的一个标准机制,用于在Java代码和本地(非Java)代码之间建立桥梁。而jni4net则为.NET Framework提供了这样的桥接,使得C#应用程序能够无缝地与Java应用进行...
JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用与C/C++库无缝结合。 首先,我们需要确保已经安装了以下组件: 1. Visual Studio 2019:这是我们的开发环境,支持...
NI是Java Native Interface的缩写,是Java平台的重要特性,使得Java代码可以方便地与C/C++代码...本文主要给出一份示例代码(工程文件见附件),描述如何在Android的JNI层开启一个线程,并在线程中回调Java层的函数。
Java和Delphi之间的交互主要通过Java Native Interface (JNI) 实现,这是一种允许Java代码调用本地(非Java)代码的框架。JNI在跨平台应用程序开发中扮演着重要角色,特别是当需要利用特定平台的库或者优化性能时。...
JNI是Java平台的一部分,它允许Java代码调用本地(非Java)代码,反之亦然。在Qt for Android中,我们可以通过JNI来调用C++编写的Qt函数,或者在C++代码中调用Android的API,实现对设备硬件和特定平台功能的访问。 ...
JNI在Java与本地代码之间提供了一个桥梁,使得Java可以调用本地库中的函数,同时也允许本地代码实例化Java对象并调用其方法。 #### 二、背景与目标 本文的主要目标是通过JNI技术来实现在Java应用程序中调用已有的...