189 8069 5689

android调用jni,android调用jni读取内存

android怎么用APK调用JNI简单实例

制作Android的内置APK,调用C或者C++去调用底层接口:

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请虚拟主机、营销软件、网站建设、饶平网站维护、网站推广。

环境配置:

eclipse要配置NDK插件和系统环境,我用的是WIN7,先去下载NDK,解压后就是一个目录,把路径记住,去XP电脑配置下环境,就像配置Java环境一样,把路径写到系统环境的PATH就好了(这样就可以编译JNI了)。然后在配置eclipse的NDK插件,点击eclipse的WINDOW/PREFERNCES,弹出框了后点击android/NDK,有个路径选择,一样选择你下载好解压的目录(选择后提示不是有效的NDK目录的时候,你在NDK目录里面新建一个文件,名字写:ndk-build,没有后缀)

如何在Android下使用JNI

关于如何在Android使用JNI调用C/C++代码库,网上已经有很多优秀的文章了,这里说一个大概过程吧:

首先需要懂C,其次要明白JNI的开发流程,然后还要知道NDK如何使用

1、在java代码中声明了一个native本地方法

Public native String helloFromc();

2、在项目目录中创建JNI文件夹

3、在JNI文件夹里面创建C文件,按照规范写代码

Jstring

Java_com_cheng_jnitest_MainActivity_helloFromc(JNIEnv* env,jobject obj)

4、用ndk-build指令编译

编译前需要配置Android.mk文件

//指定编译的文件夹,指定当前的目录

LOCAL_PATH := $(call my-dir)

//编译器在编译的时候会产生很多临时变量,中间变量最好在编译前清空所有的临时变量

include $(CLEAR_VARS)

//编译完成后的模块名

LOCAL_MOUDLE := hello

//编译的源文件

LOCAL_SRC_FILES:=hello.c

//编译一个动态库

//动态库.so 只包含运行的函数,不包含依赖,所以体积小,运行的时候回去系统寻找依赖

//静态库.a 包含所有的函数和运行的依赖,所以体积大,包含所有的api

include $(BUILD_SHARED_LIBRARY)

5、生成了一个so动态库,放到了libs里面

6、项目中引入依赖库

Static{

System.loadLibrary("hello");

}

-

android 怎么调用jni里面的方法

调用jni里面的方法,过程如下:

第一步:

使用Java编写HelloWorld 的Android应用程序:

package com.lucyfyr;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class HelloWorld extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.v("dufresne", printJNI("I am HelloWorld Activity"));

}

static

{

//加载库文件

System.loadLibrary("HelloWorldJni");

}

//声明原生函数 参数为String类型 返回类型为String

private native String printJNI(String inputStr);

}

这一步我们可以使用eclipse来生成一个App;

因为eclipse会自动为我们编译此Java文件,后面要是用到。

第二步:

生成共享库的头文件:

进入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/ 下:

可以看到里面后很多后缀为.class的文件,就是eclipse为我们自动编译好了的java文件,其中就有:

HelloWorld.class文件。

退回到classes一级目录:/HelloWorld/bin/classes/

执行如下命令:

javah com.lucyfyr.HelloWorld

生成文件:com_lucyfyr_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class com_lucyfyr_HelloWorld */

#ifndef _Included_com_lucyfyr_HelloWorld

#define _Included_com_lucyfyr_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_lucyfyr_HelloWorld

* Method: printJNI

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

可以看到自动生成对应的函数:Java_com_lucyfyr_HelloWorld_printJNI

Java_ + 包名(com.lucyfyr) + 类名(HelloWorld) + 接口名(printJNI):必须要按此JNI规范来操作;

java虚拟机就可以在com.simon.HelloWorld类调用printJNI接口的时候自动找到这个C实现的Native函数调用。

当然函数名太长,可以在.c文件中通过函数名映射表来实现简化。

第三步:

实现JNI原生函数源文件:

新建com_lucyfyr_HelloWorld.c文件:


名称栏目:android调用jni,android调用jni读取内存
URL地址:http://jkwzsj.com/article/dsgchce.html

其他资讯