- 浏览: 506341 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
lin_kk:
最近正在学,请问LZ有源码事例吗,如果有能发一下我邮箱吗,万分 ...
使用libgdx及其中的box2d 2.1的注意事项 -
ahong520:
编译都通不过
ffmpeg对音频解码的一般步骤 -
辽东小小:
yajun_soft 写道XXX@XXX:~$ adb she ...
adb push的Permission denied -
cdtdx:
好文, 相当不错啊. 收了.
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure -
dickycat:
学习了,最近正在学这一块,年纪大了,学起来有点吃亏!
使用libgdx及其中的box2d 2.1的注意事项
1、 新建一个测试类TestProvider.java a) 该类提供了2个方法 b) 一个静态的方法,一个非静态的方法 2、 JNI中新建Provider.c a) 该文件中需要把Java中的类TestProvider映射到C中 b) 把TestProvider的两个方法映射到C中 c) 新建TestProvider 对象 d) 调用两个方法 3、 Android 上层 调用 JNI层 4、 JNI层调用C层 5、 C 层调用 Java 方法 1、界面设计如下: 老样子,很搓,不过实用,嘿嘿 代码不在这贴出了,有需要的兄弟直接到文章结束部分下载。 2、 关键代码说明 C中定义映射的类、方法、对象 jclass TestProvider; jobject mTestProvider; jmethodID getTime; jmethodID sayHello; C 中映射 类 TestProvider = (*jniEnv)->FindClass(jniEnv,"com/duicky/TestProvider"); C中新建对象 jmethodID construction_id = (*jniEnv)->GetMethodID(jniEnv, TestProvider,"<init>", "()V"); TestProvider mTestProvider = (*jniEnv)->NewObject(jniEnv, TestProvider,construction_id); C 中映射方法 静态: getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider, "getTime","()Ljava/lang/String;"); 非静态: sayHello = (*jniEnv)->GetMethodID(jniEnv, TestProvider, "sayHello","(Ljava/lang/String;)V"); C 中调用 Java的 方法 静态: (*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime); 非静态: (*jniEnv)->CallVoidMethod(jniEnv, mTestProvider, sayHello,jstrMSG); 注意 GetXXXMethodID 和 CallXXXMethod 。 第一个XXX 表示的是映射方法的类型,如: 静态 跟非静态 第二个 XXX 表示 调用方法的返回值 ,如:Void,Object,等等。(调用静态方法的时候Call后面要加Static) 详细 映射方法 和 调用方法 请参考 JNI 文档 ,这个很重要 ! 3、 Java 上层 关键代码 TestProvider.Java 的两个方法 4、 Android.mk 文件 关键代码 老样子,不说了,你懂的。 如果不懂,嘎嘎,那就请点击Android.mk 文件 简介 5、 JNI文件夹下文件 Provider.h Provider.c CToJava.c 1、点击 “C调用java静态方法”按钮 C成功调用了Java中的getTime 方法,通过C方法打印出上层调用得到的时间,并且上层成功吐司出调用信息出来。 C成功调用了sayHello 方法, 并成功接收到 C 传递的参数,和 吐司出相对应的信息 a) C 映射java 方法时 对应的签名 getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider, "getTime","()Ljava/lang/String;"); 故事情节还没发展这么快,下一章才会专门介绍下这个签名的使用 b)映射方法的时候需要区别静态和非静态GetStaticMethodID,GetMethodID c)调用的时候也需要区分CallStaticObjectMethod,CallVoidMethod 而且还需要区分返回值类型 有不理解的兄弟请留言,个人技术有限,有讲错的地方请大牛们指出,讲的不够全面的请多多包涵,谢谢, 点击下载源码 C调用Java例子 本文出自 duicky 博客 , 转载请注明出处 http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html
1、主要流程
2、设计实现
package
com.duicky;
/**
*
*
* @author luxiaofeng <454162034@qq.com>
*
*/
public
class
TestProvider {
public
static
String getTime() {
LogUtils.printWithSystemOut(
"Call From C Java Static Method"
);
LogUtils.toastMessage(MainActivity.mContext,
"Call From C Java Static Method"
);
return
String.valueOf(System.currentTimeMillis());
}
public
void
sayHello(String msg) {
LogUtils.printWithSystemOut(
"Call From C Java Not Static Method :"
+ msg);
LogUtils.toastMessage(MainActivity.mContext,
"Call From C Java Not Static Method :"
+ msg);
}
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_MODULE := NDK_04
LOCAL_SRC_FILES := \
CToJava.c \
Provider.c
include $(BUILD_SHARED_LIBRARY)
#include <string.h>
#include <jni.h>
void
GetTime() ;
void
SayHello();
#include "Provider.h"
#include <android/log.h>
extern
JNIEnv* jniEnv;
jclass TestProvider;
jobject mTestProvider;
jmethodID getTime;
jmethodID sayHello;
int
GetProviderInstance(jclass obj_class);
/**
* 初始化 类、对象、方法
*/
int
InitProvider() {
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"InitProvider Begin 1"
);
if
(jniEnv == NULL) {
return
0;
}
if
(TestProvider == NULL) {
TestProvider = (*jniEnv)->FindClass(jniEnv,
"com/duicky/TestProvider"
);
if
(TestProvider == NULL){
return
-1;
}
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"InitProvider Begin 2 ok"
);
}
if
(mTestProvider == NULL) {
if
(GetProviderInstance(TestProvider) != 1) {
(*jniEnv)->DeleteLocalRef(jniEnv, TestProvider);
return
-1;
}
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"InitProvider Begin 3 ok"
);
}
if
(getTime == NULL) {
getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider,
"getTime"
,
"()Ljava/lang/String;"
);
if
(getTime == NULL) {
(*jniEnv)->DeleteLocalRef(jniEnv, TestProvider);
(*jniEnv)->DeleteLocalRef(jniEnv, mTestProvider);
return
-2;
}
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"InitProvider Begin 4 ok"
);
}
if
(sayHello == NULL) {
sayHello = (*jniEnv)->GetMethodID(jniEnv, TestProvider,
"sayHello"
,
"(Ljava/lang/String;)V"
);
if
(sayHello == NULL) {
(*jniEnv)->DeleteLocalRef(jniEnv, TestProvider);
(*jniEnv)->DeleteLocalRef(jniEnv, mTestProvider);
(*jniEnv)->DeleteLocalRef(jniEnv, getTime);
return
-3;
}
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"InitProvider Begin 5 ok"
);
}
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"InitProvider Begin 6"
);
return
1;
}
int
GetProviderInstance(jclass obj_class) {
if
(obj_class == NULL) {
return
0;
}
jmethodID construction_id = (*jniEnv)->GetMethodID(jniEnv, obj_class,
"<init>"
,
"()V"
);
if
(construction_id == 0) {
return
-1;
}
mTestProvider = (*jniEnv)->NewObject(jniEnv, obj_class,
construction_id);
if
(mTestProvider == NULL) {
return
-2;
}
return
1;
}
/**
* 获取时间 ---- 调用 Java 方法
*/
void
GetTime() {
if
(TestProvider == NULL || getTime == NULL) {
int
result = InitProvider();
if
(result != 1) {
return
;
}
}
jstring jstr = NULL;
char
* cstr = NULL;
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"GetTime Begin"
);
jstr = (*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime);
cstr = (
char
*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0);
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"Success Get Time from Java , Value = %s"
,cstr );
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"GetTime End"
);
(*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr);
(*jniEnv)->DeleteLocalRef(jniEnv, jstr);
}
/**
* SayHello ---- 调用 Java 方法
*/
void
SayHello() {
if
(TestProvider == NULL || mTestProvider == NULL || sayHello == NULL) {
int
result = InitProvider() ;
if
(result != 1) {
return
;
}
}
jstring jstrMSG = NULL;
jstrMSG =(*jniEnv)->NewStringUTF(jniEnv,
"Hi,I'm From C"
);
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"SayHello Begin"
);
(*jniEnv)->CallVoidMethod(jniEnv, mTestProvider, sayHello,jstrMSG);
__android_log_print(ANDROID_LOG_INFO,
"JNIMsg"
,
"SayHello End"
);
(*jniEnv)->DeleteLocalRef(jniEnv, jstrMSG);
}
#include <string.h>
#include <android/log.h>
#include <jni.h>
#include "Provider.h"
JNIEnv* jniEnv;
/**
* Java 中 声明的native getTime 方法的实现
*/
void
Java_com_duicky_MainActivity_getTime(JNIEnv* env, jobject thiz)
{
if
(jniEnv == NULL) {
jniEnv = env;
}
GetTime();
}
/**
* Java 中 声明的native sayHello 方法的实现
*/
void
Java_com_duicky_MainActivity_sayHello(JNIEnv* env, jobject thiz)
{
if
(jniEnv == NULL) {
jniEnv = env;
}
SayHello();
}
3、运行效果
2、点击 “C调用java非静态方法”按钮
4、C调用Java注意点
发表评论
-
编译XT720 gingerbread
2013-05-04 11:18 821在android根目录下执行". build/env ... -
编译mx 内核成功
2013-03-18 17:48 818转 : http://hi.baidu.com/_xi ... -
ubuntu下面找不到ZTE V880设备
2012-12-06 16:22 775两种方法:第一种方法是你连上你的手机,重启电脑,再adb de ... -
Android中解决图像解码导致的OOM问题
2012-10-01 18:41 790http://7dot9.com/2011/08/androi ... -
编译Android下纯C的静态程序,undefined reference to raise
2012-07-08 23:28 2330尝试在Android下编译纯C的静态程序,执行gcc -v - ... -
开发Android下纯C程序时,打开时提示not found
2012-07-08 20:09 1337这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的t ... -
NDK报错:make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。
2012-07-05 21:02 2138android开发用ndk编译so库时,有时直接从别的地 ... -
adb push的Permission denied
2012-05-30 17:19 3565遇到的问题是 zhanglanyun@zhanglan ... -
adb pull失败问题解决方法
2012-05-30 17:03 2106问题:使用adb pull命令从android系统中读取文件失 ... -
关于app2sd、a2sd、data2sd、a2sd+的区别的解释
2012-05-17 11:47 1024因为看到很多机友对这个概念不理解。首先解释一下这些缩写,全部的 ... -
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure
2012-05-17 10:56 3319Google Android手机的软件为了安全性和稳定性 ... -
android 如何自定义ProgressBar
2012-04-22 15:39 1890原文:http://blog.sina.com.cn/s/bl ... -
修改MAC,没有nvs_map.bin时该怎么做
2012-04-10 16:53 1779Basically: nvs_map.bin is what ... -
Android Activity LaunchMode 验证
2012-03-31 11:23 869在Android中,每个Activity有4种LaunchMo ... -
Android改变MAC地址
2012-03-30 13:42 21411.Find out your original MAC ad ... -
使用ndk或linux下独立交叉编译(ffmpeg)
2012-03-18 21:48 22671、ndk 编译程序 在NDK的apps目录下创建he ... -
android-ndk-r7 编译 ffmpeg-0.10
2012-03-18 21:46 4555看了这篇文章 http://blog.sina.com ... -
android2.3 MODIFY_PHONE_STATE
2012-02-27 22:14 3030一直被一些莫名其妙的电话骚扰,而且只响两声就断了,一直 ... -
Androidmanifest.xml里的<uses-feature>
2011-12-27 17:10 1314如果你是一个Android用户,而且你有一个老旧的安装有and ... -
android程序中取得root
2011-10-25 19:42 1022public static boolean runRootCo ...
相关推荐
这是一个简单的JNI开发中C层调用Java层函数的事例工程,对应的博客地址是:http://blog.csdn.net/hty1053240123/article/details/52126386
android JNI C 调用Java
这是我自己写的demo,实现了在jni里面调用java的static方法
JNI中C代码调用java的小示例。android studio2.3.3开发
visual studio 2019下C++通过JNI调用JAVA代码
android jni native C++访问java层数组,java类对象属性和方法,回调接口和线程回调接口 内附可以正常使用的demo
Java通过JNI调用算法的一些坑
Android-JNI完整工程,实现c调用java和java调用c
JNI的示例代码, C的代码如何调用Java的对象的方法。编译环境:cygwin, makefile. 纯C
delphi通过JNI调用JAVA函数的一个小DEMO
安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip
visual studio 2019下C++通过JNI调用JAVA代码,实现一个简单的打印输出!!!
java 调用 dll 的方法,即JNI的使用,demo中有get()/set()方法,操作步骤详细,即使是没用过java的程序员按照步骤依然可以成功。
Java通过JNI调用DLL动态库,亲测试编写
本资源包括JAVA工程,C++工程,C#dll测试工程
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
Java通过JNI调用C语言函数库的方法
c++通过jni调用java类. jdk1.6下通过测试
简单的通过jni在C/C++中调用Java的例子
在QT上使用JNI接口调用JAVA代码,内有2个压缩包一个README文档,1个压缩包是在QT上使用最简单的JNI接口例子,另一个是我写的在QT上使用jNI接口调用源生安卓界面的一些功能,如系统时间设置和以太网设置。