Jni 函数的静态绑定

简介:

    Jni函数绑定有两种方法,一种是静态绑定,一种是注册方式。当前介绍静态绑定

1 构造Java类

package cn.search;


import java.io.File;


import android.os.Environment;

import android.util.Log;


public class PoiResolver{


  public native String GetDistrictName(String storagePath, double longtitude, double latitude);


  public native String GetPOIName(String storagePath, double longtitude, double latitude);


  public native String GetRoadName(String storagePath, double longtitude, double latitude); 

}

说明:native修饰符告诉Java编译器这是一个绑定到JNI的函数原型

2 利用javah生成头文件

本项目使用Eclipse创建Android工程,进入工程的顶级目录,PoiResolver类文件保存在src/cn/search目录下

在顶级目录下执行如下在指令:javah -o jni/cn_search.h -classpath src/ -jni  cn.search.PoiResolver

-o:指定输出的文件名称,将在jni下创建cn_search.h文件,然后将头文件内容写入该文件

-classpath:指定需要生成h文件的类所在的包所在的位置(包cn.search在src/目录下)

-jni:指定需要生成h文件的类,这个时候必须指定详细的包名+类名

可以使用-d参数,但是不能够再使用-o参数,没有指定文件名的情况下,默认名称为包名+类名.h


注意

    在jni的.c文件中调用env,必须这样调用:return (*env)->NewStringUTF(env, "Hello !");

    在jni的.cpp文件中调用env,必须这样调用:return env->NewStringUTF("Hello !");


3 编写Application.mk

该文件定义了哪种平台的so文件,进入jni文件夹,创建Application.mk文件,写入内容:

APP_ABI := all

将生成四种平台的so文件:armeabi-v7a armeabi x86 mips

使用ndk-build指令生成so文件时候,可以通过传递参数,例子如下:ndk-build APP_ABI = armeabi-v7a ,单独生成某一个平台so文件,当然也可以直接在文件中修改


4 创建Android.mk文件

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(LOCAL_PATH)

LOCAL_MODULE    := libsearch

LOCAL_SRC_FILES := cn_search_poiresolver.cpp


include $(BUILD_SHARED_LIBRARY)


注意

    对于动态注册的方式,函数的参数列表前面两个参数是固定的:

static void SetSystemParameter(int paramType, int paramValue)

{

}


目前一段时间没有写jni接口,因此例如上面的函数定义是错误的,在调用该函数的时候,会发现传递进来的参数都是错误的,是一个非常庞大的数据,因此怀疑其实传递进来的其实是一个指针值!!

正确

static void SetSystemParameter(JNIEnv* env, jobject obj, jint paramType, jint paramValue)

{

}



     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1580781,如需转载请自行联系原作者




相关文章
|
3月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
25 0
|
6月前
|
Java C++
jni传递对象
【5月更文挑战第4天】
64 2
|
编译器 调度
FreeRTOS任务的创建(动态方法和静态方法)
FreeRTOS任务的创建(动态方法和静态方法)
755 0
|
6月前
|
Go
反射掌握指南:函数调用篇
反射掌握指南:函数调用篇
47 0
|
IDE Java 开发工具
JavaLaunchHelper类在…libinstrument.dylib中都实现将使用两者之一哪一个未定义
JavaLaunchHelper类在…libinstrument.dylib中都实现将使用两者之一哪一个未定义
100 0
JNI中访问JList的代码
JNI中访问JList的代码
62 0
|
Java C++
JNI全局回调java方法
JNI全局回调java方法
|
Java Android开发 C++
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )(一)
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )(一)
533 0
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )(一)
|
Java 编译器 C++
【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
218 0
【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
|
Java Android开发 C++
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )(三)
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )(三)
352 0