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++代码:
 
    
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/yemanling/p/4435117.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值