`
ostrichmyself
  • 浏览: 37736 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JNI Basic

阅读更多
JNI用法总结
Java侧代码就不要说什么了, 很简单:
1.参数传递
  参数如何从Java代码传递给C代码的,这里仅仅牵涉到几种基本类型:
  jstring, jboolean, jobject,jint,jdouble, 比较简单

2.参数转化
  传递过来j-参数,怎么像使用C代码一样使用?这里就有类型转化的问题。
  a>基本类型可以直接使用, 如double和jdouble可以互用。
  b> java对象使用
     对象有String对象和通用的Object对象。 处理的方式有点不同。
     不要再C/C++中调用Java的方法, C/C++处理完之后, 将数据对象传出就OK
     b1>String对象
        GetStringUTFChars取得从Java传入过来的String对象
        ReleaseStringUTFChars 用完之后需要释放
     b2>Object对象
        先得到对象的类句柄:
        jclass objectClass = (env)->FindClass("com/ostrichmyself/jni/Structure");
        然后取该类中, 需要的域句柄:
        jfieldID str = (env)->GetFieldID(objectClass,"nameString","Ljava/lang/String;");
jfieldID ival = (env)->GetFieldID(objectClass,"number","I");
        传入的jobject对象, 直接对各个域赋值。
        (env)->SetObjectField(theObjet,str,(env)->NewStringUTF("my name is D:"));
(env)->SetShortField(theObjet,ival,10);
        如果没有传入对象,而是新生成对象,则可以通过
        jobject myNewObjet = env->AllocObject(objectClass);

3.Java数组的处理
        用GetObjectArrayElement取传入的数组
        用NewObjectArray 构造一个数组

4.资源释放原则
   a1>C/C++ new的对象或者Malloc的对象,当然要由C/C++去释放
   a2>通过JNIEnv的方法new的对象, 如果不需要给Java使用,则必须释放
   a3>通过GetStringUTFChars转化从Java得到的String对象到UTF,需要开辟内存,使用完Char*时,
      务必释放内存,方法是:ReleaseStringUTFChars


基本涵盖了Java调用C++/C的语法,没有研究C调用Java,是觉得没有必要,c调用Java,说明对Java和C
的优势不清楚。
分享到:
评论
1 楼 ostrichmyself 2009-09-21  
源代码在CSDN中上传:对上面的几个部分都有介绍:

http://download.csdn.net/source/1678903

相关推荐

    android驱动JNI的USB2串口的参考实例

    ftdichip公司,FT23X USB to basic UART的android驱动和测试APP源码和说明文档,对实现android驱动和测试,很好的参考。

    sbt-jni:带有jni源码的项目的Sbt插件

    有关示例项目,请参见src/sbt-test/sbt-jni/basic 。安装resolvers + = Resolver .url( " joprice-sbt-plugins " , url( " http://dl.bintray.com/content/joprice/sbt-plugins " ))( Resolver .ivyStylePatterns)...

    Pro Android Games----精通Android 游戏开发

    Do you remember landmark games like "Wolfenstein 3D, Doom, " ... Additionally, it assumes that you are a seasoned game developer in Java and C, and have a basic knowledge of Linux and Shell Scripting. 

    TrainsProtocolJava

    火车协议Java 这是由 Michel Simatic 设计的用于火车协议的 Java 接口。 它使用 JNI 从的调用本机函数(阅读)。... 但是,除了测试/集成中的 basicTest 之外,其他测试目前无法在 Mac OS X 上运行。

    UEngine2D:c语言的2d游戏引擎

    UEngine2D 基于OpenGL ES图像库开发...For c/c++ developers game development of the underlying implementation, API encapsulation and basic construction of the framework. ###Modules Texture Manage External L

    Advanced.Java.Programming.0199455503

    It first introduces important language features such as Reflection, JNI, template, AWT and swing, Security etc. The second part primarily focuses on core network programming concepts such as sockets,...

    Android NDK Game Development Cookbook (安卓NDK游戏开发指南)

    You need to have basic knowledge of C or C++ including pointer manipulation, multithreading, and object-oriented programming concepts as well as some experience developing applications without using ...

    Android Platform Developer‘s Guide.doc

    1. Confirm a Clean Installation of a Basic Linux Kernel 38 2. Modify Your Kernel Configuration to Accommodate Android Drivers 38 3. Write Drivers 38 4. Burn Images to Flash 39 5. Boot the kernel and ...

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.plaf.synth javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing....

    Visual C++ 编程资源大全(英文源码 其它)

    CScheduledTask.zip Basic class for using the Microsoft Task Scheduler(33KB)<END><br>102,copylocation.zip This shell extension adds the ability to copy file and folder names from the Windows ...

Global site tag (gtag.js) - Google Analytics