jni的应用主要设计到java调用C/C++以及C/C++回调java。
首先是java调用c/c++中的函数,这部分比较简单,基本上市一下步骤:
编写java类,类似
public class CActivityMain extends Activity {
/** Called when the activity is first created. */
static {
System.loadLibrary("my_jni");
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}
public native String stringFromJNI();
}
其实就是简单的java调用类,我们主要是要把要使用的接口声明在
public native String stringFromJNI();
生成h的c/c++头文件
javah –jni com.hm.hello.CactivityMain
com.hm.hello是包名,CactivityMain是对应的jni接口生成的class文件
然后就是实现h文件中的函数就行了!
C/c++回调java
这个就有些麻烦,主要是分两中情况:1,同线程内调用。2,子线程内的调用!
JNIEXPORT jstring JNICALL Java_com_tymx_zndx_jni_stringFromJNI(JNIEnv *env, jobject obj)
{
return env->NewStringUTF("Hello from JNI !");
}
这种调用很简单,主要是注意参数以及数据结构的转化!!!
查看方法的签名方法:
首先进入bin目录,运行 javap -s -p -classpath 类路径 .java对应的class文件
E:\Android\Project\clientTest\bin>"C:\Program Files\Java\jdk1.6.0_25\bin\javap.e xe" -s -p -classpath E:\Android\Project\clientTest\bin\com\tymx\zndx .ServiceTransactionServiceTransaction的路径E:\Android\Project\clientTest\bin\com\tymx\zndx;