1.编写native方法,eg:public native String stringFromJNI(String abc);
2.通过命令生成.h头文件,eg: 进入到工程的bin目录,javah -classpath classes -d 输出的文件夹目录 包.类名称
3.编写.c文件
4.编写android.mk文件
5.通过Cygwin生成.so文件
6.通过 static {
System.loadLibrary("hello-jni");
}
导入.so文件。
package com.example.testsdk;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.btn_setddd);
bt.setOnClickListener(new ButtonListener());
TextView tv = (TextView) findViewById(R.id.text_test);
tv.setText("123");
}
class ButtonListener implements OnClickListener {
public void onClick(View arg0) {
callResult(new MainActivity.QueryClientListener() {
@Override
public void packetParser(String ipAddr, String port, String json) {
Log.i("tuanhui", "ipAddr = " + ipAddr+ ",port = " + port + ",json="+ json);
}
@Override
public void onQueryStart() {
}
@Override
public void onQueryFinish() {
}
});
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void callback() {
Log.e("lhb", "java callback function ");
}
public interface QueryClientListener{
public void onQueryStart();
public void packetParser(String ipAddr, String port, String json);
public void onQueryFinish();
}
public native String stringFromJNI(String abc);
public native void callbackMethod();
public native void callResult(QueryClientListener listener);
static {
System.loadLibrary("hello-jni");
}
// add for test
// end add
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
return true;
}
return false;
}
}
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <string.h>
#include <jni.h>
#include "wldsdk.h"
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
*/
extern void SendUdpData();
extern void SendTcpData();
//tuanhui start
//android 回调的接口实例
void Java_com_example_testsdk_MainActivity_callResult(JNIEnv *env, jobject thiz, jobject callBack)
{
jmethodID onQueryStart;
jmethodID packetParser;
jmethodID onQueryFinish;
jclass queryClientListener;
LOGI("Query Start");
queryClientListener =(*env)->GetObjectClass(env,callBack);
onQueryStart=(*env)->GetMethodID(env,queryClientListener,"onQueryStart","()V");
packetParser=(*env)->GetMethodID(env,queryClientListener,"packetParser","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
onQueryFinish=(*env)->GetMethodID(env,queryClientListener,"onQueryFinish","()V");
jstring ipAddress = (*env)->NewStringUTF(env, "192.168.1.102");
jstring port = (*env)->NewStringUTF(env,"6655");
jstring jsonString = (*env)->NewStringUTF(env,"{'PT':'1','PV':'0'}");
LOGI("Query Start 2");
(*env)->CallVoidMethod(env,callBack,packetParser,ipAddress,port,jsonString);
}
//tuanhui end
jstring Java_com_example_testsdk_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz ,jstring prompt)
{
LOGD("LOGD lhb test");
LOGI("LOGI lhb test");
const char* str = NULL;
str = (*env)->GetStringUTFChars(env,prompt,NULL);
LOGI("lhb test get str = %s",str);
//SendUdpData();
//SendTcpData();
CreateSearchDevThread();
CreateReceiveSearchDevThread();
if(str == NULL)
{
return NULL;
}
else
{
return (*env)->NewStringUTF(env, "ssdddd");
}
}
#if 0
void SendUdpData()
{
int socket_descriptor; //套接口描述字
int iter=0;
char buf[80]={0};
struct sockaddr_in address;//处理网络通信的地址
LOGI("lhb enter SendUdpData");
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("192.168.158.1");//这里不一样
address.sin_port=htons(9102);
//创建一个 UDP socket
if ((socket_descriptor=socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
LOGI("lhb socket create failed");
return;
}
else
{
LOGI("lhb socket create success");
}
//IPV4 SOCK_DGRAM 数据报套接字(UDP协议)
sprintf(buf,"data packet with ID 12");
sendto(socket_descriptor,buf,sizeof(buf),0,(struct sockaddr *)&address,sizeof(address));
close(socket_descriptor);
LOGI("lhb exit SendUdpData");
}
void SendTcpData()
{
int sockfd,sock_dt;
struct sockaddr_in my_addr;//local ip info
struct sockaddr_in dest_addr; //destnation ip info
int destport = 6000;
int n_send_len = 0;
int connectResult = 0;
LOGI("lhb enter SendTcpData");
if(-1 == (sockfd = socket(AF_INET,SOCK_STREAM,0)) )
{
LOGI("lhb create tcp socket failed");
return;
}
else
{
LOGI("lhb create tcp socket success");
}
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(6000);
dest_addr.sin_addr.s_addr = inet_addr("192.168.8.144");
memset(&dest_addr.sin_zero,0,8);
//connect
connectResult = connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr));
LOGI("lhb connect result = %d\n",connectResult);
if(-1 == connectResult )
{
LOGI("lhb connect error\n");
}
else
{
LOGI("lhb connect success\n");
n_send_len = send(sockfd,"-f00k you.\n-why?\n-how\n",strlen("-fuck you.\n-why?\n-how\n"),0);
LOGI("lhb SendTcpData data len =%d\n",n_send_len);
close(sockfd);
}
LOGI("lhb exit SendTcpData");
}
void Java_com_example_testsdk_MainActivity_callbackMethod(JNIEnv *env, jobject obj)
{
jclass cls = (*env)->GetObjectClass(env, obj);
LOGI("lhb in function callbackMethod");
/*
jmethodID mid =
(*env)->GetMethodID(env, cls, "callback", "()V");
if (mid == NULL) {
LOGI("lhb in function callbackMethod mid == NULL");
return; /* method not found */
}
(*env)->CallVoidMethod(env, obj, mid);*/
}
#endif
进入到工程的bin目录, javap -classpath classes -s 包.类名称