android ndk jni 实例1

简介: 1、检查所需文件是否齐全 使用第三方动态库,应该至少有 2 个文件,一个是动态库(.so),另一个是包含 动态库 API 声明的头文件(.
1、检查所需文件是否齐全
使用第三方动态库,应该至少有 2 个文件,一个是动态库(.so),另一个是包含
动态库 API 声明的头文件(.h) 
例:
Add.c(实际上如果使用第三方库时我们是没有源码的,这里为了方便举例): 
#include<stdio.h> 
int Add(int x, int y) 
  }
return x+y; 
  {
Add.h: 
#ifndef _ADD_H_ 
#define _ADD_H_ 
int Add(int x, int y); 
#endif 
使用如下 Makefile(其中红色路径需要按环境修改):
ANDROID_PATH =/home/rock/SV8860_SDK_v0.92/Source/skydroid1.6 
TOOLCHAIN_PATH = 
$(ANDROID_PATH)/platform/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin 
CFLAGS = 
-I$(ANDROID_PATH)/platform/development/ndk/build/platforms/android-4/arch-ar
m/usr/include 
LDFLAGS = 
-L$(ANDROID_PATH)/platform/development/ndk/build/platforms/android-4/arch-ar
m/usr/lib 
CC = $(TOOLCHAIN_PATH)/arm-eabi-gcc 
LD = $(TOOLCHAIN_PATH)/arm-eabi-ld 
all: 
                  $(CC) -O2-fPIC -c $(CFLAGS) $(LDFLAGS) Add.c -olibadd.o 
                  $(LD) -olibadd.so libadd.o -shared   
clean: 
                  rm -rflibadd.o 
                  rm -rflibadd.so 编译成动态库 libadd.so,用来模拟第三方动态库
2、封装原动态库
原动态库文件不包含 jni 接口需要的信息,所以我们需要对其进行封装,所以我
们的需求是:将 libadd.so 里面的 API 封装成带 jni 接口的动态库 libaddjni.so,步
骤如下:
A) 新建一个 Android 工程:com.android.libjni,其默认生成的 APK 运行结果是:
B) 在这个工程中新建一个 java 类,其中包含封装后的 API 函数,生成 jni 格式
的头文件(.h)
LibJavaHeader.java:
package com.android.libjni; 
public class LibJavaHeader { 
    public native int Add(intx, int y); 
  {
在命令行中进入该工程的 src 目录
运行如下命令
> javaccom\android\libjni\LibJavaHeader.java
> javah com.android.libjni.LibJavaHeader
此时在 src 目录下生成了一个名为 com_android_libjni_LibJavaHeader.h的头文件,
其内容如下:
com_android_libjni_LibJavaHeader.h: 
 
#include<jni.h> 
 
#ifndef_Included_com_android_libjni_LibJavaHeader 
#define_Included_com_android_libjni_LibJavaHeader 
#ifdef __cplusplus 
extern "C" { 
#endif 
  */
* Class:           com_android_libjni_LibJavaHeader 
* Method:         Add 
* Signature: (II)I 
 
@Override
public void onCreate(Bundle savedInstanceState){ 
          super.onCreate(savedInstanceState); 
int iResult = new LibJavaHeader().Add(5,6); 
TextView tv = new TextView(this); 
tv.setText(Integer.toString(iResult)); 
setContentView(tv); 
  {    
       
static
  }    
System.loadLibrary("addjni"); 
  {
{
3、编写库的封装函数 libaddjni.c 
根据前面生成的 com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用
来生成 libaddjni.so 
libaddjni.c: 
#include<jni.h> 
#include "Add.h" 
#ifdef __cplusplus 
extern "C" { 
#endif 
  */
* Class:           com_android_libjni_LibJavaHeader * Method:        Add 
* Signature: (II)I 
  /*
JNIEXPORT jint JNICALLJava_com_android_libjni_LibJavaHeader_Add 
      (JNIEnv*pJE, jobject jo, jint jiX, jint jiY) 
  }
                  returnAdd(jiX, jiY); 
  {
#ifdef __cplusplus 
  {
#endif 
在 Android 源码的 platform/external新建一个文件夹 libaddjni,将libaddjni.c、Add.h
放入该目录,创建 Android.mk,内容如下:
LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_PRELINK_MODULE := false 
LOCAL_SRC_FILES := libaddjni.c 
LOCAL_SHARED_LIBRARIES := libadd 
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) 
LOCAL_MODULE := libaddjni 
include $(BUILD_SHARED_LIBRARY) 
然 后 将 libadd.so 拷 贝 到 out/target/product/generic/obj/lib和
out/target/product/generic/system/lib 目 录中 , 在 platform 目 录下运行make 
libaddjni 编译之后会产生一个out/target/product/generic/obj/lib/libaddjni.so
4、开始测试
#adb push libaddjni.so /system/lib 
#adb push libadd.so /system/lib 
然后在 eclipse 运行 andro
目录
相关文章
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
223 1
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
114 1
|
3月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
164 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
3月前
|
开发工具 Android开发
解决Android Studio编译提示NDK is missing a “platforms“ directory
解决Android Studio编译提示NDK is missing a “platforms“ directory
180 1
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
140 4
|
4月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
5月前
|
安全 Java Android开发
使用Unidbg进行安卓逆向实例讲解
使用Unidbg进行安卓逆向实例讲解
128 2
|
6月前
|
Java Android开发
Android JNI 调用
Android JNI 调用
34 1
|
5月前
|
XML Java Android开发
Android Studio2.2 中支持NDK开发HelloJNI例子
Android Studio2.2 中支持NDK开发HelloJNI例子
31 0