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
的优势不清楚。
分享到:
相关推荐
ftdichip公司,FT23X USB to basic UART的android驱动和测试APP源码和说明文档,对实现android驱动和测试,很好的参考。
有关示例项目,请参见src/sbt-test/sbt-jni/basic 。安装resolvers + = Resolver .url( " joprice-sbt-plugins " , url( " http://dl.bintray.com/content/joprice/sbt-plugins " ))( Resolver .ivyStylePatterns)...
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.
火车协议Java 这是由 Michel Simatic 设计的用于火车协议的 Java 接口。 它使用 JNI 从的调用本机函数(阅读)。... 但是,除了测试/集成中的 basicTest 之外,其他测试目前无法在 Mac OS X 上运行。
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
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,...
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 ...
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 ...
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....
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 ...