android JNI实践之java端调用C\C++

  关于android JNI的讲解网络上已经很多了,这里贴出自己的实践步骤,加深印象。

  1)编写java代码,并通过javac JniFuncMain.java编译class文件:

public class JniFuncMain{
private static int staticIntFiled = 300;
static{
System.loadLibrary("jnifunc");
}
public static native JniTest createJniObject();
public static void main(String[] args){
System.out.println("java CreateJniObject()调用本地方法");
JniTest jniObj = createJniObject();
jniObj.callTest();
}
}

  2)通过javah JniFuncMain生成C/C++的.h头文件

  3)参考.h头文件的方法头 写 C/C++文件,jnifunc.cpp代码:

#include "JniFuncMain.h"
#include <stdio.h>
JNIEXPORT jobject JNICALL Java_JniFuncMain_createJniObject
(JNIEnv *env, jclass clazz){
jclass targetClass;
jmethodID mid;
jobject newObject;
jstring helloStr;
jfieldID fid;
jint staticIntFiled;
jint result;

fid = env->GetStaticFieldID(clazz,"staticIntFiled","I");
staticIntFiled = env->GetStaticIntField(clazz,fid);
printf("cpp| 获取staticIntFiled \n");
printf("staticIntFiled is %d\n",staticIntFiled);

targetClass=env->FindClass("JniTest");
mid=env->GetMethodID(targetClass,"<init>","(I)V");
printf("CPP| 生成JniTest 对象");
newObject = env->NewObject(targetClass,mid,100);

mid =env->GetMethodID(targetClass,"callByNative","(I)I");
result =env->CallIntMethod(newObject,mid,200);

fid =env->GetFieldID(targetClass,"intFiled","I");
printf("CPP| 设置JniTest对象的intFielid的200\n");
env->SetIntField(newObject,fid,result);
return newObject;
}

   4)通过C++编译工具生产链接库。如果没安装环境的话需要下载Visual C++ 2008 Express Edition。

    安装完之后使用在Microsoft Visual Studio 9.0\VC\bin下的cl.exe 来生成dll,

cl -I "C:\Program Files (x86)\java\jdk1.6.0_14\include" -I "C:\Program Files (x86)\java\jdk1.6.0_14\include\win32" -I "D:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include" -LD jnifunc.cpp

这里有-I 添加路径到cl所要搜索的路径,这里因为我们有可能需要用到jni.h、jni_md.h、stdio.h等,所以需要加上去,如果还缺少其他头文件,则需要找到头文件的路径并且使用-I加进去。

-LD表示 创建DLL

  

    至此,运行java JniFuncMain即可调用java函数,并在java的native方法通过JNI调用C++代码:

    

时间: 2024-11-03 18:57:00

android JNI实践之java端调用C\C++的相关文章

Android中关于JNI 的学习(三)在JNI层访问Java端对象

前面两篇文章简单介绍了JNI层跟Java层的一些对应关系,包括方法名,数据类型和方法名称等,相信在理论层面,能够很好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,由于表达能力或者理解还是有限,有些地方讲得不是很清楚,如果各位朋友有觉得云里雾里,欢迎大家留言一起学习. 概念上的理解有助于我们更好地认识JNI,而一些实际点的例子则能够更好地帮我们从代码上去掌握并应用JNI. 在第一篇文章,我们是从一个小例子来入门学习的,在其中,我们通过JNI层函数返回

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

转:Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

Android JNI之C/C++层调用JAVA

摘要: 摘要: 转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930032.html 从C/C++层调用JAVA层代码步骤: 1. 在JAVA类中创建java方法和本地方法 public class TestNdk{ int a;//本示例中将被修改的JAVA变量 Handler handler; public TestNdk(Handler handler){ this.handler = handler; setUp(); } public nati

android NDK 实用学习-java端对象成员赋值和获取对象成员值

1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值  env->SetBooleanField(jobj, jfbdata, false); 对double类型成员进行赋值 env->SetDoubleField(jobj, jfddata, 209.22); 对int类型成员进行赋值 env->SetIntField(jobj, jfidata, 3653); 对byte类型成员

Android中关于JNI 的学习(三)在JNI层訪问Java端对象

前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,因为表达能力或者理解还是有限,有些地方讲得不是非常清楚.假设各位朋友有认为云里雾里,欢迎大家留言一起学习. 概念上的理解有助于我们更好地认识JNI.而一些实际点的样例则可以更好地帮我们从代码上去掌握并应用JNI. 在第一篇文章,我们是从一个小样例来入门学习的,在当中,我们通过JNI层函数返回

android NDK 实用学习(三)- java端类对象的构造及使用

1,读此文章前我假设你已经读过: android NDK 实用学习-获取java端类及其类变量 android NDK 实用学习-java端对象成员赋值和获取对象成员值 2,java端类对象的构造: ①首先获取类; ②获取类的无参构造函数: jmethodID initID = env->GetMethodID(jcSetDataMgr, "<init>", "()V"); ③构造类实例: jobject jresult = env->New

android jni 总复习(转载)

本文全文转载自:http://www.cnblogs.com/shuqingstudy/p/4909089.html,非常感谢 1 package com.test.androidjni; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.widget.TextView; 7 8 9 public class MainActivity e

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法的中文API Android JNI学习(五)——Demo演示 本片文章大纲如下: 1.导读 2.什么是NDK 3.为什么使用NDK 4.NDK到SO 5.JNI 大纲.png 一.导读 在Android OS上开发应用程序,Goog