用C/C++调用Java
来源:互联网 发布:制作mv软件 编辑:程序博客网 时间:2024/05/29 03:20
用C/C++调用Java的方法我没有去研究,也不知道从哪里开始研究,对Linux我了解到很少,希望有朋友可以给些资料,我的水平很差,望大家多多包涵。
这个例子是别人的代码,我忘记从来里弄来的了,先对原作者表示抱歉。同时代码也被我修改过,再次道歉。
而此文和别的文章一样,只是作为我平时学习积累的验证。
1. Android.mk文件:
LOCAL_SRC_FILES参数用空格隔开
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE:=native
- LOCAL_SRC_FILES:=geolo.cpp my_jni.h
- include $(BUILD_SHARED_LIBRARY)
2. geolo.cpp
先用FindClass方法找到java类,有点类似java的反射用LoadClass
再用CallObjectMethod方法调用Java类的函数。
- #include "my_jni.h"
- jobject getInstance(JNIEnv* env, jclass obj_class){
- jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
- jobject obj = env->NewObject(obj_class, construction_id);
- return obj;
- }
- JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv* env, jobject thiz){
- jstring str;
- jclass java_class = env->FindClass("com/easepal/geolo/CForCall");
- if (java_class == 0){
- return env->NewStringUTF("not find class!");
- }
- jobject java_obj = getInstance(env, java_class);
- if (java_obj == 0){
- return env->NewStringUTF("not find java OBJ!");
- }
- jmethodID java_method = env->GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");
- if(java_method == 0){
- return env->NewStringUTF("not find java method!");
- }
- str = (jstring)env->CallObjectMethod(java_obj, java_method);
- return str;
- }
3. my_jni.h
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_easepal_geolo_CActivityMain */
- #ifndef _Included_com_easepal_geolo_CActivityMain
- #define _Included_com_easepal_geolo_CActivityMain
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_easepal_geolo_CActivityMain
- * Method: stringFromJNI
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv *, jobject);
- #ifdef __cplusplus
- }
- #endif
- #endif
4. CActivityMain.java
- package com.easepal.geolo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class CActivityMain extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- tv.setText( stringFromJNI("hello") );
- setContentView(tv);
- }
- static {
- System.loadLibrary("native");
- }
- public native String stringFromJNI(String str);
- }
5. CForCall.java
- package com.easepal.geolo;
- public class CForCall{
- public CForCall(){};
- //public ~CForCall(){};
- public String GetJavaString(){
- String str;
- str = "123456";
- return str;
- }
- }
0 0
- 用C/C++调用Java
- java调用C语言
- java调用c
- 实现java调用c
- Java调用C/C++
- C调用JAVA
- C/C++调用Java
- java调用C
- java调用c、c++
- Android C调用Java
- Java调用C JNI
- java调用c程序
- Java调用C/C++
- Java调用C语言
- android java 调用 c
- java 调用C/C++
- jni c调用java
- C调用Java
- 每日一练(一) the cow's world
- 默认及非默认端口的动态监听/静态监听实验汇总
- HDU4584
- Python相关的资料
- SharePoint 2013 中使用 delegate control AdditionalPageHead 的注意事项
- 用C/C++调用Java
- HDU4671
- linux epoll模型
- 34-输入5个数字,使用递归的算法倒叙输出
- HDU4690
- 如何使用cygwin编译 ffmpeg
- 如何判断上传的文件类型??是先判断再上传还是先上传再判断?真实的文件类型是什么样的?
- shell脚本和makefile的异同
- HDU 1160(类似于最长上升子序列)